ABC400 E - Ringo‘s Favorite Numbers 3

感觉反而是全场的简单题。

题面

当且仅当正整数 NNN 同时满足以下两个条件时,它是 400 数

  • NNN 恰好有 222 个不同的质因数。
  • 对于 NNN 的每个质因数 pppppp 除以 NNN 的次数是偶数。更正式地说, pkp^kpk 整除 NNN 的最大非负整数 kkk 是偶数。

处理 QQQ 次查询。每次查询都会得到一个整数 AAA ,请找出不超过 AAA 的最大 400 个数字。在此问题的限制条件下,不超过 AAA 的 400 个数字总是存在的。


看到质因数,果断质因数分解。

根据数论,可知如果要满足第二点,NNN 一定是完全平方数。

观察到 N≤1012N \le 10^{12}N1012,则 N≤106\sqrt N \le 10^6N106,是一个相对小的范围。考虑将题目往 N\sqrt NN 上面引。

而如果要满足第一点,NNN 就有两个质因子,而显然 N\sqrt NN 也是只有两个质因子。

因此就考虑使用调和级数,每一个数的质因子数量很容易通过埃氏筛法求出。复杂度 O(nlog⁡n)O(n \log n)O(nlogn)

考虑如何得到答案,直接把所有只有两个质因子的数存下来,直接二分即可。


#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 200010, M = 1000010;
bool f[M];
int cnt[M];
int q;
vector<int> v;

signed main() {
	f[1] = 1;
	cnt[1] = 0;
	for (int i = 2; i <= 1e6; i++) {
		if (!f[i]) {
			cnt[i] = 1;
			for (int j = 2 * i; j <= 1e6; j += i)
				f[j] = 1, cnt[j]++;
		}
	}
	for (int i = 1; i <= 1e6; i++)
		if (cnt[i] == 2)
			v.push_back(i);
	cin >> q;
	while (q--) {
		int x;
		cin >> x;
		int y = sqrt(x);
		int pos = *(--upper_bound(v.begin(), v.end(), y));
		cout << pos*pos << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值