uva12716 GCD XOR(数论、xor、枚举)
题意:
多组测试,每次输入 \(n\),问有多少对整数 \((a,b)\) 满足 \(1\le a\le b \le n\) 且 \(\gcd (a,b) = a\oplus b\)
\(T\le 1e4, n\le 3e7\)
思路:
设 \(g=\gcd (a,b)\) ,则根据题目条件必有 \(a-b=g\)
证明:
首先要知道一个性质:\(a-b\le a\oplus b(=g)\)
设 \(a=k_1g, b=k_2g\)。当 \(k_1=k_2\) 时题目条件不可能成立,故不用考虑。当 \(k_1>k_2\) 时,\(a-b\ge g\)
综上,\(a-b=g\)
接下来枚举 \(g\) 和 \(a=kg(k\ge 2)\) ,判断 \(b\) 是否合法。怎么判断呢?因为 \(b=(k-1)g\),所以 \(\gcd(a,b)=g\) 一定满足,故只需判断是否有 \(g=a\oplus b\)
预处理答案,每次询问直接输出。
const signed N = 3e7 + 3;
int ans[N];
signed main() {
iofast;
for(int g = 1; g <= N/2; g++)
for(int a = g + g; a < N; a += g) {
int b = a - g;
if((a ^ b) == g) ans[a]++; //注意括号
}
for(int i = 1; i < N; i++) ans[i] += ans[i-1];
int q; cin >> q;
for(int i = 1; i <= q; i++) {
int n; cin >> n;
cout << "Case " << i << ": " << ans[n] << endl;
}
}

浙公网安备 33010602011771号