题意:
输入整数n,1<= n <=3e7,问有多少个整数对(a,b)满足:1 <= b <= a <= n,且gcd(a,b)== a XOR b
解法:
a^b = c 等价于a^c = b 所以枚举a和c,而a和c全部枚举肯定TLE,所以高效算法:通过c是a的约数这个关系来枚举会减小循环,必须要将c放在循环外面,因为c的情况比较少。其实本题就是要求:c=a-b(规律),c=a^b
1 /* 2 打表找规律 3 */ 4 #include<cstdio> 5 #include<cmath> 6 #include<cstring> 7 using namespace std; 8 int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b); } 9 const int maxn = 3e7 + 5; 10 int ans[maxn]; 11 12 void generate() { 13 //类似于筛素数,我们的外层是公约数(素数) 14 //注意筛素数的时候我们先筛小的,也就是最基本的那个,这样子就可以筛掉所有最基本的那个的倍数 15 for (int c = 1; c <= maxn / 2; c++) { 16 for (int a = c + c; a <= maxn; a += c) { 17 int b = a - c; 18 if ((a^b) == c) ans[a]++; 19 } 20 } 21 for (int i = 2; i < maxn; i++)ans[i] += ans[i - 1]; 22 } 23 24 int main() { 25 int T; scanf("%d", &T); 26 int kase = 0; 27 generate(); 28 while (T--) { 29 int n; scanf("%lld", &n); 30 printf("Case %d: %d\n", ++kase, ans[n]); 31 } 32 return 0; 33 }