uva 12716 约数关系的打表优化方法 lrj-P318

来源:互联网 发布:流程图用什么软件画 编辑:程序博客网 时间:2024/06/06 02:10

题意:

给出一个区间,问这个区间内有多少个数对满足   a^b==gcd(a,b)  

题解:

打表

发现  gcd ==a-b ( a > b)

然后就打表就行了,打表的时候有优化,枚举 c ,然后枚举 c 的倍数作为 a

然后计算 b ,再判断即可,最后通过递推得到最终答案


#include<stdio.h>#define MAXN 30000005int ans[MAXN];void init(){    for(int c=1;c<MAXN;c++){        for(int a=c+c;a<MAXN;a+=c)            if((a^(a-c))==c)                ans[a]++;        ans[c]+=ans[c-1];    }}int main(){    init();    int cases=1,n,T;    //freopen("in.txt","r",stdin);    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        printf("Case %d: %d\n",cases++,ans[n]);    }    return 0;}