1. 程式人生 > >51NOD 1616 最小集合

51NOD 1616 最小集合

com int ret include stream 發現 傳送門 ctype ()

傳送門

分析

不難發現集合中的數一定是集合內其它一堆數的$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\n",Ans); return 0; }

51NOD 1616 最小集合