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;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-10 11:42
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务