Logo Wy Online Judge

WyOJ

Paste!

#include <algorithm>
#include <iostream>
#include <vector>

int main() {
	using namespace std;
	int n;
	cin >> n;
	int maxv = 0;
	auto arr = new int[n];
	for(int i = 0; i < n; i++)
	{
		cin >> arr[i];
		maxv = max(maxv, arr[i]); 
	}
	
	vector<bool> isprime(maxv + 1, true);
	vector<int> primes;
	auto mfactor = new int[maxv + 1];
	for(int i = 2; i <= maxv; i++)
		if(isprime[i])
		{
			primes.push_back(i); 
			mfactor[i] = i;
			for(int j = i * 2; j <= maxv; j += i)
			{
				isprime[j] = false;
				mfactor[j] = i;
			}
		}
	
	vector<bool> has_pf(maxv + 1, false);
	auto check = [&] (const int num) {
		int tmp = num;
		for(auto i : primes)
		{
			if(i * i > num)
				break;
			if(tmp % i)
				continue;
			if(has_pf[i])
				return false;
			while(tmp % i == 0)
				tmp /= i;
			has_pf[i] = true;
		}
		while(num >= has_pf.size())
			has_pf.push_back(false); 
		if(tmp == 1)
			return true;
		if(has_pf[tmp])
			return false;
		has_pf[tmp] = true;
		if(tmp == num && num > primes.back())
			primes.push_back(num);
		return true; 
	};
	int neq = 0;
	int last = 0;
	for(int i = 0; i < n; i++)
	{
		if(!neq)
		{
			int tmp = arr[i];
			while(tmp != 1)
			{
				if(has_pf[mfactor[tmp]])
				{
					neq = 1;
					break;
				}	
				has_pf[mfactor[tmp]] = true;
				int tgt = mfactor[tmp];
				while(tmp != 1 && mfactor[tmp] == tgt)
					tmp /= mfactor[tmp];
			} 
			if(!neq)
				cout << arr[i] << ' ';
			last = arr[i];
		}
		if(neq)
		{
			int now = last + 1;
			while(!check(now))
				++now;
			cout << now << ' ';
			if(neq == 1)
				last = 1;
			else
				last = now;
			++neq;
		}
	}
	delete[] mfactor;
	delete[] arr;
	return 0; 
}