题目大意 【#|第十一届蓝桥杯大赛软件类决赛 C/C++ 大学 B 组 试题 C: 阶乘约数(n!质因数分解)】
文章图片
解题思路 实际上就是一个数学知识加上因数个数定理的裸题了。看到约数个数,我们不难想到约数个数定理:
- 设一个数 x x x的唯一分解式为 p 1 a 1 p 2 a 2 . . . p n a n p_1^{a_1}p_2^{a_2}...p_n^{a_n} p1a1??p2a2??...pnan??,那么其因数个数为 ( a 1 + 1 ) ( a 2 + 1 ) . . ( a n + 1 ) (a_1+1)(a_2+1)..(a_n+1) (a1?+1)(a2?+1)..(an?+1)
ll cal(int n, int x) {
ll ans = 0;
while (n) {
ans += n / x;
n /= x;
}
return ans;
}
以下代码更通用
//
// Created by Happig on 2020/11/12
//
#include using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
vector prime;
bitset vis;
void euler() {
vis.reset();
for (int i = 2;
i < maxn;
i++) {
if (!vis[i]) {
prime.push_back(i);
}
for (int j = 0;
j < prime.size() && i * prime[j] < maxn;
j++) {
vis[i * prime[j]] = 1;
if (i % prime[j] == 0) break;
}
}
}ll cal(int n, int x) {
ll ans = 0;
while (n) {
ans += n / x;
n /= x;
}
return ans;
}ll solve(int n) {
ll ans = 1;
for (auto p : prime) {
if (p > n) break;
ans *= cal(n, p) + 1;
}
return ans;
}int main() {
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
//ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n;
euler();
cin >> n;
cout << solve(n) << endl;
return 0;
}
推荐阅读
- #|kuangbin线段树专题
- Codeforces|Codeforces940F Machine Learning (带修莫队)
- #|流读写文件的四种实现方式
- #|2022年第十三届蓝桥杯大赛软件赛省赛——C++ B组
- 技术·教程|Javascript中遇到的问题: 缓动动画函数的封装
- #|《力扣刷题》 二分查找(x 的平方根)
- #|【调研】用「图神经网络」 解决「小样本」 分类问题(上)
- #|2017年蓝桥杯省赛-承压计算
- #|力扣-105题 从前序与中序遍历序列构造二叉树(C++)- dfs