万圣节的入场券
万圣节的入场券
[万圣节Party开始前……]
万圣节到了,LazyJazz要办一个大Party(Communist Party)!
于是LazyJazz邀请了同学朋友,远近亲戚共计 n 人,每人发了一张Party入场券。
可是到了万圣节这一天,不知怎的来了 n+1 个人(果然是鬼节),而且每人手里都拿了一张入场券,这让LazyJazz十分头疼。
好在当时发入场券时,每张券上都印了一个验证码。真的入场券的验证码由一个固定合数 x 乘上一个两两入场券互不相同的质数 pi 得到。
于是LazyJazz一一检视了所有人的验证码,发现了一个另类(即不满足除 x 的商为一个质数),于是保安把这个好学生恐怖分子拖了出去。
LazyJazz觉得这是很有意思,决定把他看到的所有验证码告诉你,让你猜猜哪个验证码是假的。
输入格式
第一行,一个正整数 n (9<n),表示正常应到人数
第二行,包含 n+1 个用空格隔开的正整数 Ai,表示实际到场的 n+1 个人手里的入场券上的验证码。
输入数据保证只有一个“另类”验证码,且可以判断出来
输出格式
一个正整数,表示假的验证码。
样例
input
10
12 76 92 116 87 44 8 20 68 28 52
output
87
国庆Day3的T1
一如既往地沙雕,被卡了int
最重要的是这次还要记成绩
慌得一批
首先是一个素数筛(打表会被卡)
然后我们可以知道,枚举那个合数,但是全都判的话是O(nx)的,是会T的
所以我们来推一个规律,因为只有一个是不符合的,所以选三个数的话,就可以保证至少有两个合法的,所以我们就可以用O(3x)的时间得到x
然后就可以写一个O(n)来判断
下面给出代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> using namespace std; inline long long rd(){ long long x=0,f=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; return x*f; } inline void write(long long x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); return ; } int book[15000006]; int pr[1500006]; int total=0; inline void pre(long long x){ for(int i=2;i<=x;i++){ if(book[i]==0){ book[i]=i; pr[++total]=i; } for(int j=1;j<=total;j++){ if(pr[j]>book[i]||pr[j]*i>x) break; book[i*pr[j]]=pr[j]; } } memset(book,1,sizeof(book)); for(int i=1;i<=total;i++) book[pr[i]]=0; return ; } int n; long long a[100006]; int main(){ pre(1500000); scanf("%d",&n); for(int i=1;i<=n+1;i++) a[i]=rd(); int set=0; for(int i=4;i<=100000;i++){ if(book[i]==0) continue; int cnt=0; if(a[1]/i<1500000&&a[1]%i==0&&book[a[1]/i]==0) cnt++; if(a[2]/i<1500000&&a[2]%i==0&&book[a[2]/i]==0) cnt++; if(a[3]/i<1500000&&a[3]%i==0&&book[a[3]/i]==0) cnt++; if(cnt>=2){ set=i; break; } } for(int i=1;i<=n+1;i++){ if(a[i]%set!=0){ printf("%lld",a[i]); return 0; } if(book[a[i]/set]){ printf("%lld",a[i]); return 0; } } return 0; }
蒟蒻总是更懂你✿✿ヽ(°▽°)ノ✿