您的位置:首页 > 其它

UVa 12716 - GCD XOR(筛选+规律)

2015-07-27 21:10 441 查看
输入一个数n,(1≤n≤30000000)n,(1≤n≤30000000),输出有多少对整数满足1≤a≤b≤n,gcd(a,b)=a⨁b1≤a≤b≤n,gcd(a,b)=a \bigoplus b。

设c=a⨁bc=a \bigoplus b,则a⨁c=ba \bigoplus c=b。找规律可得,当满足条件时,c=a−bc=a-b。

因此,枚举c、ac、a,对每一对验证c=a⨁bc=a \bigoplus b即可。时间复杂度O(nlogn)O(nlogn)。

#include<cstdio>
using namespace std;
const int maxn=30000010;
int a[maxn];
void init(){
int k=maxn/2;
for(int i=1;i<k;++i)
for(int j=i+i;j<maxn;j+=i)
if(i==(j^(j-i))) ++a[j];
for(int i=1;i<maxn;++i)
a[i]+=a[i-1];
return;
}
int main(){
init();
int t,tt=0;scanf("%d",&t);
while(t--){
int n;scanf("%d",&n);
printf("Case %d: %d\n",++tt,a
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: