Codeforces Round #579 (Div. 3) C - Common Divisors 【数论】
题目:http://codeforces.com/contest/1203/problem/C
大致题意:
给你n个数字,问你他们的共同公约数的种数。
思路:
找出最大公约数的因子数即可。
代码部分:
我怀疑CF是针对我,这两份代码几乎一样,但不知道为什么第二份代码就是TLE。眼睛都快看瞎了都没找出不一样来。
好了,感谢@皓洲大佬,第二份代码 TLE 的问题在于最后的那个循环中,i 不能开成 int,会爆int的,因为i可能会到达 gd 的数量级。改成 long long 就解决了。
第一份代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//ll gcd(ll a,ll b)
//{
// while(b^=a^=b^=a%=b);
// return a;
//}
ll a[400015];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
ll minnum = a[0];
for(int i=1;i<n;i++)
{
if(__gcd(minnum,a[i]) < minnum)
minnum = __gcd(minnum,a[i]);
if(minnum == 1)
break;
}
if(minnum == 1)
printf("1\n");
else
{
ll ans = 0;
for(ll i=1;i*i<=minnum;i++)
{
if(minnum==i*i)
ans++;
else if(minnum%i==0)
ans+=2;
}
printf("%lld\n",ans);
}
return 0;
}
第二份代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//ll mygcd(ll a, ll b) {
// while(b^=a^=b^=a%=b);
// return a;
//}
ll num[400015];
int main() {
int n;
scanf("%d",&n);
for(int i = 0; i < n; i++)
scanf("%lld",&num[i]);
ll gd = num[0];
for(int i = 1; i < n; i++) {
ll temp = __gcd(gd, num[i]);
if(temp < gd)
gd = temp;
if(gd == 1)
break;
}
if(gd == 1) {
printf("1\n");
}
else {
ll ans = 0;
//这个位置!!!!!!!!!!必须要用long long
//我就不改了,把这个错误放在这里提醒自己。
for(int i = 1; i*i <= gd; i++) {
if(gd == i*i)
ans++;
else if((gd % i) == 0)
ans+=2;
}
printf("%lld\n",ans);
}
return 0;
}