UVA 12716 GCD XOR
https://vjudge.net/problem/UVA-12716
求有多少对整数(a,b)满足:1<=b<=a<=n,且gcd(a,b)=a XOR b
结论:若gcd(a,b)= a XOR b = c,则c=a-b
证明:
1、任意两个数a,b,若a>=b,则 a-b <= a XOR b
2、若 c为a、b的最大公约数,且a>=b,则 a-b >= c
假设存在 c 使得 a-b > c,则 c<a-b<=a XOR b,即 c<a XOR b,与题意不符
所以枚举a,枚举a的约数c,b=a-c, gcd(a,b)= gcd(a,a-c)= c
只需要判断 是否满足 a XOR b = c即可
小技巧:先枚举c,再枚举a,时间复杂度为O(logn)
#include<cstdio> using namespace std; int ans[30000001]; int main() { int T,n,a,b,c; for(c=1;c<=15000000;c++) for(a=c<<1;a<=30000000;a+=c ) { b=a-c; if(c==(a^b)) ans[a]++; } for(int i=1;i<=30000000;i++) ans[i]+=ans[i-1]; scanf("%d",&T); for(int t=1;t<=T;t++) { scanf("%d",&n); printf("Case %d: %d\n",t,ans[n]); } }