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