AT_abc400_e [ABC400E] Ringo‘s Favorite Numbers 3 题解

洛谷题目传送门

题目大意

正整数 N N N400 数当且仅当它同时满足以下两个条件:

  • N N N 正好具有 2 2 2 不同的素数因子。
  • 对于 N N N 的每个素因子 p p p p p p 将整除 N N N 偶数次。更正式地说,最大非负整数 k k k 使得 p k p^k pk 整除 N N N k k k 是偶数。

Q Q Q 次查询。每个查询给出一个整数 A A A,请你找出不超过 A A A 的最大 400 数。数据保证始终存在不超过 A A A 的 400 数。

解题思路

我们使用筛法筛出所有素数并打上标记,然后再跑一遍,计算每个数 x x x 的质因子个数,如果为 2 2 2,那么 x 2 x^2 x2 就是满足题意的一个解,把他存起来。

对于每次询问 A A A,我们只需要找到未超过 ⌊ A ⌋ \lfloor\sqrt{A}\rfloor A 的最大的只有两个质因子的数 k k k,那么直接输出 k 2 k^2 k2 即可。

CODE:

#include 
using namespace std;
#define int long long
const int N = 1e6 + 10;
int cnt[N], ans[N];
bool isprime[N];
inline void shai() {
	for (int i = 2; i <= 1e6; ++i) {
		if (!isprime[i]) {
			for (int j = i + i; j <= 1e6; j += i) {
				isprime[j] = true;
			}
		}
	}
	for (int i = 2; i <= 1e6; ++i)
		if (!isprime[i]) {
			for (int j = i; j <= 1e6; j += i) {
				cnt[j]++;
			}
		}
	for (int i = 6; i <= 1e6; ++i) {
		if (cnt[i] == 2) {
			ans[i] = i;
		} else {
			ans[i] = ans[i - 1];
		}
	}
}
signed main() {
	ios::sync_with_stdio(false);
	ios_base::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	shai();
	int T;
	cin >> T;
	while (T--) {
		int n;
		cin >> n;
		n = ans[(int)sqrtl(n)];
		cout << n * n << "\n";
	}
	return 0;
}

你可能感兴趣的:(算法,c++,数据结构,c语言,笔记)