CF1203 兼第五次训练赛(C)

CF 1203 Common Divisors
题意:
求n个数的公共因数。
思路:
本来想着每个数的因子存起来,然后后面数的因子在原数组中就保留,没有就舍弃,但是数据太大时间会超限,所以可以求出n个数的最大公因数然后求其因子个数,求GCD的因子数时需要优化,不然也会时间超限。
这里说明一下,求n个数的最大公因数只要求第n个数和前n-1个数最大公因数的最大公因数即可,数论内容不懂证明,只会结论。
当然这里 long long 变量类型太长可以选择#define ll long long 利用宏先简化代码长度。

#include <iostream>
using namespace std;

long long Gcd(long long a,long long b)
{
    if(a<b)//交换这一步可以不要,因为下一步辗转相除的时候就自动交换了。
    {
        long long t=a;
        a=b;
        b=t;
    }
    long long temp;
    while(b!=0)
    {
        temp=a%b;//辗转相除,也可使用迭代
        a=b;
        b=temp;
    }
    return a;
}

int main()
{
    long long n,i,j,k,gcd;
    cin>>n;
    cin>>k;
    for(i=2;i<=n;i++)
    {
       cin>>j;
       gcd=Gcd(k,j);//求第n个数和前n-1个数的最大公因数
       k=gcd;
    }
    long long ans=0;
    for(i=1; i*i<=k; i++)//优化循环
    {
        if(k%i==0&&i*i!=k)
            ans+=2;
        if(i*i==k)
            ans+=1;
    }
    cout<<ans<<endl;
    return 0;
}
Cu1
发布了30 篇原创文章 · 获赞 2 · 访问量 973

猜你喜欢

转载自blog.csdn.net/CUCUC1/article/details/104415325