2021.4.10CAS月赛H题题解

标题

H-最小互质数
题目
我们定义两个数的互质数当且仅当gcd(a, b) = 1。
现在L手里有n个数,分别为a1,a2,a3 ……an-1,an 。
问,没有在这n个数中出现过并且与这n个数都互质的最小的数是多少。
LL觉得这个问题太简单了,于是她把这个问题交给你来解决。
输入
第一行一个数n (1 ≤ n, ai ≤ 10^5)
接下来n行,每行一个数,分别代表a1,a2,a3 ……an-1,an 。
输出
输出一行代表答案
样例输入 Copy
5
1
2
3
4
5
样例输出 Copy
7
提示
没有在这n个数中出现的数有:6,7,……
6与2, 3, 4不互质,最小的与这n个数互质的数就是7了。
题目大意
输入n个数,输出一个与这些数都不互质的数;
思路
用一个数组来标记出现过的数以及这个数的因子。如果输入的数没有1则直接输出1,,否则用一个for循环输出标记数组第一个没有被标记的数。(代码如下)

#include
using namespace std;
const int N = 1e6;
int vis[N];
int main()
{
     
	int n;
	cin >> n;
	int flag = 0;
	for (int i = 0; i < n; i++)
	{
     
		int x;
		cin >> x;
		if (x == 1)
            {
     
			flag = 1;
			continue;
            }
            vis[x]=1;
        for (int j = 2; j * j <= x; j++)
		{
     
			while (x % j == 0)
			{
     
				x /= j;
				vis[j] = 1;//标记这个数的因子
			}
		}
		 vis[x] = 1;//标记这个数因子
	}
	if (flag==0) cout<<"1"<<endl;
	else
    {
     
		for (int i = 2; i <= N; i++)
		{
     
			if (vis[i]==0)
			{
     
				cout << i << endl;
				return 0;
			}
			else
            {
     
				for (int j = 2; j * i <= N; j++)
				{
     
					vis[i * j] = 1; //标记这个数倍数
				}
			}
		}
	}
	return 0;
}

你可能感兴趣的:(2021.4.10CAS月赛H题题解)