UVA

来源:互联网 发布:java病毒代码 编辑:程序博客网 时间:2024/06/05 16:56

题意:给出范围n,在[1,n]中,有多少对a,b(a>b),gcd(a,b)=a xor b;(xor为异或);
思路:因为若a xor b=c,那么a xor c=b,又因为c=gcd(a,b),所以只需要枚举所有的c,再枚举c的所有倍数a,判断是否a xor c=b,gcd(a,b)=c;

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<map>#include<stack>#include<queue>#include<algorithm>#include<set>#include<vector>#include<cmath>#define lmid l,m,rt<<1#define rmid m+1,r,rt<<1|1#define LL long long#define rl r-l+1using namespace std;const int maxn=30000000+5;int s[maxn];void init(){     for(int c=1;c<maxn/2;c++){          for(int a=2*c;a<maxn;a+=c){               int b=a-c;               if((a^b)==c)               s[a]++;          }     }     for(int i=2;i<maxn;i++)          s[i]+=s[i-1];}int main(){     init();     int t;     scanf("%d",&t);     for(int ca=1;ca<=t;ca++){          int n;          scanf("%d",&n);          printf("Case %d: ",ca);          cout<<s[n]<<endl;     }}
原创粉丝点击