题目1493:公约数

来源:互联网 发布:精子优化处理检查 必要 编辑:程序博客网 时间:2024/06/05 11:44

http://ac.jobdu.com/problem.php?pid=1493

思路:

       1、求最大公约数,gcd

       2、最大公约数,因式分解,(循环除小于bound的素数)

       3、k1个因子1,k2个因子2,k3个因子3...

       4、ans=(k1+1)(k2+1)(k3+1)....

#include <stdio.h>#include <string.h>#include <math.h>int prime[110001];                  //数组开的大一点,求10000以内的素数bool mark[110001];int size;void init(){int i;memset(prime,0,sizeof(prime));memset(mark,0,sizeof(mark));    size=0;for (i=2;i<=110000;i++){if (mark[i]){continue;}prime[size++]=i;if (i>=1000){continue;}for (int j=i*i;j<=110000;j+=i){mark[j]=true;}}}int gcd(int a,int b){return b==0?a:gcd(b,a%b);}int main(){ int i,a,b;init();while (scanf("%d%d",&a,&b)!=EOF){int x;x=gcd(a,b);int bound=sqrt(x)+1;int k=0,ans=1;for (i=0;prime[i]<bound;i++){while (x%prime[i]==0){               k++;   x/=prime[i];}ans*=(k+1);k=0;if (x==1)        //能分解完{break;}}if (x!=1)            //若有大于bound的因子,则其一定只有一个{ans*=2;}printf("%d\n",ans);}return 0;}


原创粉丝点击