筛法,打表。
通过打表可知,但gcd(a,b)==a xor b时,a xor b = a-b.
就是求满足 c = a-b且c = a xor b 的c的个数。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 30000000; int ans[maxn+10]; int a,b,c,n; int T; void init() { int data=maxn>>1; memset(ans,0,sizeof(ans)); for(int c=1;c<=data;c++) for(int a=c*2;a<=maxn;a+=c) { b=a-c; if((a^b)==c) ans[a]++; } for(int i=2;i<=maxn;i++) ans[i]+=ans[i-1]; } int main() { init(); scanf("%d",&T); for(int i=1;i<=T;i++) { scanf("%d",&n); printf("Case %d: %d ",i,ans[n]); } return 0; }