SP30919 题解

题目传送门

结论:最终输出的数一定是质数。

原因:假设有一个合数成为了最终输出的结果,那么这个合数中一定有一个质因子与序列中的所有数都互质。

举个例子:

5 7 25(样例 11),对于数字 66 来说,其与该序列中的所有数都互质。

6=2×36=2\times3,发现 2233 均满足该条件。

因此答案是 22,而并非 66

代码实现部分

前置芝士:欧拉筛素数。

发现 ai107a_i\leq10^7,所以使用时间复杂度为 O(n)\operatorname{O}(n) 的欧拉筛法(P3383)。

然后对于每个 aia_i,将其进行分解,将所除的质数全部打上标记。

最后输出第一个没有打标记的质数即可。

#include<bits/stdc++.h>
using namespace std;
int isprime[10000005],prime[10000005],cnt,vis[10000005],f[10000005];
void getprime(int n){
	memset(isprime,1,sizeof(isprime));
	isprime[1]=0;
	for(int i=2;i<=n;++i){
		if(isprime[i])prime[++cnt]=f[i]=i;
		for(int j=1;j<=cnt&&i*prime[j]<=n;++j){
			isprime[i*prime[j]]=0;
			f[i*prime[j]]=prime[j];
			if(i%prime[j]==0)break;
		}
	}
}
inline int read(){
    int x=0,f=1;
    char c=getchar();
    for (;c<'0'||c>'9';c=getchar())
        if (c=='-') f=-1;
    for (;c>='0'&&c<='9';c=getchar())
        x=(x<<1)+(x<<3)+c-48;
    return x*f;
}
int T,n,x;
int main(){
	getprime(10000000);
	T=read();
	while(T--){
		memset(vis,0,sizeof(vis));
		n=read();
		for(int i=1;i<=n;++i){
			x=read();
			while(x>1){
				vis[f[x]]=1;
				x/=f[x];
			}
		}
		for(int i=1;i<=cnt;++i){
			if(!vis[prime[i]]){
				cout<<prime[i]<<endl;
				break;
			}
		}
	}
	return 0;
}
posted @   Weslie_qwq  阅读(2)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示