首页 > 代码库 > UVa12716 - GCD XOR

UVa12716 - GCD XOR

题意

给一个数n,找出gcd(a,b) = a^b的个数   (1<=b<=a<=n)。

n的数据范围:1到30000000

思路

c满足gcd(a,b) = a^b,打表观察数据得出c = a - b;又因为c是a的约数,用类似素数筛选的方法降低时间复杂度。

总结

敲代码的时候忘记打表这个东西的存在,只要一次性将所有的结果算出存在数组里,每次提取就可以,不用每次都算一遍。

智障啊_(:з」∠)_为什么想不到,不然又可以A一道题

#include <iostream>#include <cstdio>#include <algorithm>#include <map>#include <cstring>#include <string>typedef long long LL;const LL maxn = 30000005;using namespace std;LL ans[maxn];LL T, kase = 0, n;void solve(){    for(int i = 1; i <= maxn; i++)        for(int j = i+i; j <= maxn; j+=i)            if((j^(j-i)) == i) ans[j]++;    for(int i = 2; i <= maxn; i++)        ans[i] += ans[i-1];}int main(){    //freopen("in.txt","r",stdin);    solve();    cin >> T;    while(T--) {        cin >> n;        cout << "Case " << ++kase << ": " << ans[n] << endl;    }    return 0;}

 

UVa12716 - GCD XOR