C.Common Divisors
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
You are given an array 𝑎 consisting of 𝑛 integers.
Your task is to say the number of such positive integers 𝑥 such that 𝑥 divides each number from the array. In other words, you have to find the number of common divisors of all elements in the array.
For example, if the array 𝑎 will be [2,4,6,2,10], then 1 and 2 divide each number from the array (so the answer for this test is 2).
Input
The first line of the input contains one integer 𝑛 (1≤𝑛≤4⋅105) — the number of elements in 𝑎.
The second line of the input contains 𝑛 integers 𝑎1,𝑎2,…,𝑎𝑛 (1≤𝑎𝑖≤1012), where 𝑎𝑖 is the 𝑖-th element of 𝑎.
Output
Print one integer — the number of such positive integers 𝑥 such that 𝑥 divides each number from the given array (in other words, the answer is the number of common divisors of all elements in the array).
input
5 1 2 3 4 5
output
1
input
6 6 90 12 18 30 18
output
4
题意就是找一组数的所有公因子的个数。
感觉就是这组数最大公因数的因子个数。
用试除法,根号的复杂度,完全没问题。
大概坑点就是为了求公因数方便直接读入了2个数但是忘掉了n==1的情况!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
ll div(ll x) {
if(x==1){
return 1;
}
ll ans=0;
ll tmp=sqrt(x);
for(ll i=1;i<=tmp;i++) {
if(i*i==x){
ans++;
continue;
}
if(x%i==0){
ans+=2;
}
}
return ans;
}
int main()
{
int n;
ll t,a,b;
scanf("%d",&n);
if(n==1){
scanf("%lld",&a);
ll fk=div(a);
cout<<fk<<endl;
return 0;
}
scanf("%lld%lld",&a,&b);
t=gcd(a,b);
for(int i=0;i<n-2;i++){
scanf("%lld",&a);
t=gcd(t,a);
}
ll res=div(t);
cout<<res<<endl;
return 0;
}