C. Common Divisors(div3)
题意:给你 n n n 个数,求这 n n n 个数的公因子个数。
gcd扫一遍找出
n
n
n 个数的最大公倍数
x
x
x ,
x
x
x 的因子个数就是答案。
求
x
x
x 的因子个数用 唯一质因数分解定理:
任意一个合数
x
x
x 仅能以一种方式,写成如下的乘积形式:(
p
i
e
i
pi^{ei}
piei为素数)
x
x
x =
p
1
e
1
×
p
2
e
2
×
…
×
p
r
e
r
p1^{e1}\times p2^{e2}\times …\times pr^{er}
p1e1×p2e2×…×prer
x
x
x 的因子数=
(
e
1
+
1
)
×
(
e
2
+
1
)
×
.
.
.
.
×
(
e
r
+
1
)
(e1+1)×(e2+1)×....×(er+1)
(e1+1)×(e2+1)×....×(er+1)
#include<cstdio>
#define ll long long
const int Max_num=4e5+17;
const int Mn=1e6+6;
ll c[Max_num];
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
int real[Mn],tail=0;
bool prim[Mn];
void ol(){
prim[0]=prim[1]=true;
for(int i=2;i<Mn;++i){
if(!prim[i]) real[tail++]=i;
for(int j=0;j<tail&&i*real[j]<=Mn;++j){
prim[i*real[j]]=true;
if(!i%real[j]) break;
}
}
}
ll cal(ll x){
ol();
ll ans=1;
for(int i=0;i<tail&&real[i]*real[i]<=x;++i){
if(x%real[i]==0){
ll res=0;
while(x%real[i]==0) x/=real[i],++res;
ans*=(res+1);
}
if(x==1) break;
}
if(x>1) ans*=2;
return ans;
}
int main(){
int n;scanf("%d",&n);
for(int i=0;i<n;++i) scanf("%I64d",&c[i]);
ll res=c[0];
for(int i=1;i<n;++i) res=gcd(res,c[i]);
printf("%I64d\n",cal(res));
return 0;
}