zoukankan      html  css  js  c++  java
  • 51NOD 1616 最小集合

    传送门

    分析

    不难发现集合中的数一定是集合内其它一堆数的$gcd$

    于是我们枚举$i$,统计原来集合中有几个数是$i$的倍数,设这个值为$f(i)$

    之后对于每个$i$如果不存在$f(x*i) = f(i)$则这个$i$合法,答案累加一

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    int f[1000100],Ans,is[1000100];
    int main(){
        int n,m=0,i,j,k;
        scanf("%d",&n);
        for(i=1;i<=n;i++){
          int x;
          scanf("%d",&x);
          is[x]=1;
          m=max(m,x);
        }
        for(i=1;i<=m;i++)
          for(j=i;j<=m;j+=i)
            if(is[j])f[i]++;
        for(i=1;i<=m;i++)
          if(f[i]){
            int ok=0;
            for(j=2*i;j<=m;j+=i)
              if(f[j]==f[i]){
                ok=1;
                break;
              }
            if(!ok)Ans++;
          }
        printf("%d
    ",Ans);
        return 0;
    }
  • 相关阅读:
    (一)ngxin默认虚拟主机
    centos7 搭建LNMP
    centos7 搭建安装zabbix3.0邮件告警实例(二)
    Java BitSet(位集)
    OLTP与OLAP的区别
    Cassandra-LSM树
    LSM树
    Docker
    RESTful API
    kubernetes介绍
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9824927.html
Copyright © 2011-2022 走看看