HDU 5750 Dertouzos 线性素数筛 最大因子

传送门
题意大意是:给定的 n, d, 求不超过 n 且最大因子是 d 的数有多少个
则 m*d = n 中 d 是最大因子
显然如果 m 是非素数的话,那么一定可以分解出一个数,这个数会和 d 构成更大的 n 的因子。
此外,如果 d 是非素数的话,那么可能 d 分解出的数乘上某个小于 d 的素数的乘积比 d 本身要大。所以这题中,如果第一次发现 d 是某个素数的整数倍,那么就应当到此为止。为什么呢?
我们知道,一个数可以分解成素数的乘积,即:
d = p1^k1*p2^k2*p3^k3*p4^k4*p5^k5...
它乘上某个素数 pm 的结果是
m = pm*p1^k1*p2^k2*p3^k3*p4^k4*p5^k5...
它的最大的非自身的因数是
p1^k1*p2^k2*p3^k3*p4^k4*p5^k5...
那你如果找到 d 的第一个素数因子 p1 没有结束的话,枚举下一个素数 pt 乘上去,那么新的数就是
m = p1^k1*pt*p2^k2*p3^k3*p4^k4*p5^k5...
它的最大的非自身的因数是
p1^(k1-1)*pt*p2^k2*p3^k3*p4^k4*p5^k5...
就不再是 d 了,所以所枚举的素数最大最大是 d 的最小因子

所以先打个素数表然后一个个找就可以了

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
bool not_prime[maxn];
int prime[maxn];
void init() {
	memset(not_prime, false,sizeof(not_prime));
	int k = 0;
	for (int i = 2; i < maxn; ++i) {
		if (!not_prime[i]) {
			prime[k++] = i;;
		}
		for (int j = 0; j<k && i*prime[j] < maxn; ++j) {
			not_prime[i*prime[j]] = true;
			if (i%prime[j] == 0)
				break;
		}
	}
}
int main() {
	std::ios::sync_with_stdio(false);
	init();
	int T;
	cin >> T;
	int n, d;
	while (T--) {
		cin >> n >> d;
		int ans = 0;
		for (int i = 0;;++i) {
			if (d*prime[i] >= n)
				break;
			ans++;
			if (d%prime[i] == 0)
				break;
		}
		cout << ans << endl;
	}
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值