紫书数论例题10-5 uva 12716 找规律

来源:互联网 发布:如何关闭淘宝手机店铺 编辑:程序博客网 时间:2024/04/28 15:53

题意:

输入整数n(1<=n<=3千万),有多少对整数(a,b)满足:1<=b<=a<=n,且gcd(a,b)=a XOR b。例如:n=7时,有4对:(3,2),(5,4),(6,4),(7,6)。

题解:

首先打表找规律,发现c=a-b
因为c是a的因数
要保证计算量尽量小,如果枚举a,就要枚举a的所有因数,有些数因为可能是多个数的因数,会被重复考虑很多次。所以这里要枚举因数 c ,a = k × c(k >= 2) 这样每个因数只枚举一遍,再检验b。
参考:http://www.cnblogs.com/naturepengchen/articles/3952145.html
注意算完后前缀和一下,因为题目要的n之前所有的整数对

代码:

#include <iostream>#include <cstdio>using namespace std;const int maxn = 3e7;int f[maxn+5];void solve(){    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)        {           f[a]++;        }    }    for(int i=3;i<=maxn;i++)        f[i]+=f[i-1];}int main(){    solve();    int T;    cin>>T;    long long n;    int k=1;    while(T--)    {          cin>>n;          printf("Case %d: %d\n",k++,f[n]);    }    return 0;}