万圣节的入场券

万圣节的入场券

[万圣节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;
}

 

 
posted @ 2018-10-03 16:12  Bruce--Wang  阅读(211)  评论(0编辑  收藏  举报