//发现了规律
//对于满足条件gcd(a,b)=a^b的数对a,b(a>b) 有gcd(a,b)=a^b=a-b;
//于是我假设 只要满足a^b=a-b就一定有gcd(a,b)=a^b
//但是写成如下代码,会超时
//for(int i=1;i<maxn;i++)
// for(int j=i+1;j<=maxn;j++)
// if(i^j=j-i) f[j]++;
//因为i,j之间没有关系盲目枚举
//那么假设gcd(a,b)=a^b=a-b=c
//因为a是c的倍数,用c表示b b=a-c 代换一下a^(a-c)=c
//那么我们枚举c
//for(int i=1;i<=maxn/2;i++)//枚举c
// for(int j=i;j<=maxn;j+=i)//枚举c的倍数a
// if(j^(j-i)=i) f[j]++;
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 30000000
int f[maxn+10],ans[maxn+10];//gcd(a,b)=a^b(假设a>b中的a) f[a]就是数对a,b的个数
int gcd(int a,int b) {return b==0?a:gcd(b,a%b);}
int main()
{
memset(f,0,sizeof(f));
for(int i=1;i<=(maxn>>1);i++)
for(int j=2*i;j<=maxn;j+=i)
if( (i^j)==j-i ) f[j]++;
ans[1]=0;
for(int i=2;i<=maxn;i++) ans[i]=ans[i-1]+f[i];
int T;
scanf("%d",&T);
for(int i=1;i<=T;i++)
{
printf("Case %d: ",i);
int k;
scanf("%d",&k);
printf("%d\n",ans[k]);
}
return 0;
}
LA 6657 GCD XOR
最新推荐文章于 2021-07-10 22:15:39 发布