F - GCD or MIN
https://atcoder.jp/contests/abc191/tasks/abc191_f
有n个数,有n-1个操作,要么就是把两个数变成gcd,要么就是取min,问最后出现的数有多少种。
思路:
由于gcd(x,y)<=min(x,y),那么我们取的最大的数就是都取min,然后就是一些数的因数了,然后我们看看能不能凑成这个数,也就是这个数的所有倍数中是否gcd等于这个数,这个数j肯定是大于等于他在map中存的值的,因为我们 枚举a[i]的因数然后取讲mp[j]与a[i]取gcd,这个值是越来越非递增的。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=2010;
int gcd( int a,int b)
{
return b?gcd(b,a%b):a;
}
int a[N];
map<int,int>mp;
int n;
int main()
{
cin >> n;
int minv=2e9;
for(int i= 1;i<=n;i++)
{
cin >> a[i];
minv=min(minv,a[i]);
for(int j=1;j*j<=a[i];j++)
{
if(a[i]%j==0)
{
mp[a[i]/j]=gcd(mp[a[i]/j],a[i]);
mp[j]=gcd(mp[j],a[i]);
}
}
}
int ans=0;
for(auto it:mp)
{
if(it.first>minv) continue;
if(it.first== it.second)
ans++;
}
cout << ans << endl;
return 0;
}
查看10道真题和解析