对每个数字,求他的因子。
由于i^j >= i-j ,而目前需要得到的是公约数k,因此已知i,已知k,j只能等于i-k,然后判断
i^j == k 是否成立。
当然我不是这么过的。我算出i^k得到j再判断j与i的公约数,然后特判j=0和j能够被i整除。这样就过啦~
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
#define maxn 30000007
int ans[maxn];
int gcd(int a,int b){
if(b == 0) return a;
return gcd(b,a%b);
}
int main(){
int u,v;
memset(ans,0,sizeof(ans));
for(int i = 1;i < maxn; i++){
for(int j = i;j < maxn; j+=i){
u = i^j;
if(u<=j && u!=0&& u % i == 0){
if(gcd(u,j) == i) {
ans[j]++;
}
}
}
}
for(int i = 1;i < maxn; i++)
ans[i] = ans[i]+ans[i-1];
int tt=1,t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("Case %d: %d\n",tt++,ans[n]);
}
return 0;
}