CF2029E Common Generator 题解

Super_Cube

2024-11-17 11:23:38

Solution

Solution

首先以 2 作为基底可以生成所有合数,因为如果是偶数那就一直加 2,否则让其减去最小质因子,就会变为一个偶数。而质数只能由其本身生成(这个应该不用细说)。

于是若存在两个不同质数,直接无解。若不存在质数,直接输出 2

现在只剩下一个质数 p。对其翻倍就能得到因子 2,那之后的工作就跟第一段写的差不多,所以若有偶数小于 2p 就会无解,或奇合数减去其最小质因子小于 2p 也会无解。

Code

#include<bits/stdc++.h>
int g[400005];
inline void sieve(int n){
    for(int i=2;i*i<=n;++i)
        if(!g[i])for(int j=i*i;j<=n;j+=i)if(!g[j])g[j]=i;
}
int a[100005];
int T,n,v;
int main(){
    sieve(4e5);
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=1;i<=n;scanf("%d",&a[i++]));
        v=0;
        for(int i=1;i<=n;++i)
            if(!g[a[i]]){
                if(!v)v=a[i];
                else if(v!=a[i]){
                    puts("-1");
                    goto nxt;
                }
            }
        if(!v){
            puts("2");
            continue;
        }
        for(int i=1;i<=n;++i){
            if(a[i]==v)continue;
            if(a[i]-(a[i]&1?g[a[i]]:0)<(v<<1)){
                puts("-1");
                goto nxt;
            }
        }
        printf("%d\n",v);
        nxt:;
    }
    return 0;
}