专栏文章

题解 007 题目 AT_abc383_d

AT_abc383_d题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miquj9n6
此快照首次捕获于
2025/12/04 10:58
3 个月前
此快照最后确认于
2025/12/04 10:58
3 个月前
查看原文

说在前面

这是我赛时的做法,并不是很优秀,时间复杂度似乎是错的,但是可以通过,因此分享出来,欢迎大家指正。

题目分析

  • 首先我们知道,对 nn 分解质因数有 n=i=1npiain=\prod\limits_{i=1}^n p_i^{a_i},其中 pip_i 为质数,aia_i 为正整数,那么 nn 的因数个数为 i=1n(ai+1)\prod\limits_{i=1}^n (a_i+1)
  • 题目要求求有 99 个因数的数,那么这个数肯定能表示成 p12p22p_1^2 \cdot p_2^2p8p^8 的形式,p1,p2,pp_1,p_2,p 均为质数,直接分类讨论即可。
  • 可以先筛出或打表出所有的质数,缩短运行时间。最后的时间复杂度 O(n0.75)O(n^{0.75}),有超时的风险,但实测并不会超时,可以参考代码中的一些小技巧。在此贴出AtCoder 提交记录洛谷评测记录

通过代码

CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
bool ip[4000005];
int n,ans;
bool check1(int x){
	if (!ip[x]) return 0;
	// 如果 x 是质数可以直接跳过,x 肯定不会超过 2e6,可以直接判断。
	for (int i=2;i*i<x;i++){
		if (x%i!=0) continue;
		if ((!ip[i])&&(!ip[x/i])) return 1;
		else return 0; // 直接返回 0 可以缩短运行时间。
	}
	return 0;
}
signed main(){
	ios::sync_with_stdio(0);
	cin>>n;
	ip[1]=1;
	for (int i=2;i<=2000;i++){
		if (ip[i]==0){
			for (int j=i*2;j<=4000000;j+=i){
				ip[j]=1;
			}
		}
	} // 埃氏筛。
	for (int i=2;i*i<=n;i++){
		if (check1(i)) ans++;
	} // 情况 1。
	for (int i=2;i*i*i*i*i*i*i*i<=n;i++){
		if (!ip[i]) ans++;
	} // 情况 2。
	cout<<ans;
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...