[乱搞] Codeforces 73E Beta Round #66 E. Morrowindows

来源:互联网 发布:保护java源代码的程序 编辑:程序博客网 时间:2024/05/17 23:16

远古乱搞题
我们发现选择一个ai可以在所有ai的倍数后面切一刀 表示把他们分开了 那么我们的目标是 所有的数后面都得被切至少一刀 我们发现质数要被切显然只能选他本身 而我们选所有质数 也肯定是最少的 然后 就做完了
坑点多多 我是败在没有特判ai=1
其实还有ai有重复吧?

#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;typedef long long ll;inline char nc(){  static char buf[100000],*p1=buf,*p2=buf;  return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}inline void read(int &x){  char c=nc(),b=1;  for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;  for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;}const int N=5000005,mP=N/10;bool vst[N];int prime[mP],num;inline void Pre(int n){  for (int i=2;i<=n;i++){    if (!vst[i]) prime[++num]=i;    for (int j=1;j<=num && (ll)prime[j]*i<=n;j++){      vst[prime[j]*i]=1;      if (i%prime[j]==0) break;    }  }}int tag[N],a[N];int main(){  int n,x;  freopen("a.in","r",stdin);  freopen("a.out","w",stdout);  read(n); read(x);  int flag=0; for (int i=1;i<=n;i++) read(a[i]),flag|=a[i]==1;  if (flag && x>2) return printf("1\n"),0;  if (x>5e6) return printf("-1\n"),0;  Pre(x);  for (int i=1;i<=n;i++)    if (a[i]<=x)      tag[a[i]]=1;  int cnt=0;  for (int i=1;i<=num && prime[i]<x;i++)    if (!tag[prime[i]])      return printf("-1\n"),0;    else      cnt++;  printf("%d\n",cnt);  return 0;}
0 0
原创粉丝点击