Not Adding (CF2D) (基底转化,两两操作->多个操作,+)

 

 思路:

  • 题目信息: 转化: 选出子序列求一个gcd, 很关键
  • 基底转化: 枚举1-1e6的数, 看能不能产生这个数, 
  • 在利用那个那个的性质即可, 贪心让所有合理的数gcd起来是不是1
#include <bits/stdc++.h>
using namespace std;
#define M 2000005
#define ri int 

int n,m;
int T;
int p[M];
int flag[M];
int gcd(int a,int b)
{
    if(a<b) swap(a,b);
    if(a%b==0) return b;
    return gcd(b,a%b);
}
int qu[M];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);

    cin>>n;
    for(ri i=1;i<=n;i++)
    {
        cin>>p[i];
        flag[p[i]]=1;
    }
    int ans=0;
    for(ri i=1;i<=1e6;i++)
    {
        int tmp=0,r=0;
        if(flag[i]) continue ;
        for(ri j=2;j<=1e6&&i*j<=1e6;j++)
        {
            if(flag[i*j])
            {
                if(r==0) tmp=j,r++;
                else tmp=gcd(tmp,j);
                if(tmp==1)
                {
                    ans++;
                    break;
                }
            }
        }
        
    }
    cout<<ans;
    return 0;

}
View Code

 

posted @ 2023-02-20 12:32  VxiaohuanV  阅读(18)  评论(0编辑  收藏  举报