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]);
    }
}

 

posted @ 2017-08-18 14:57  TRTTG  阅读(141)  评论(0编辑  收藏  举报