51NOD 1616 最小集合
阿新 • • 發佈:2018-10-21
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 最小集合