题目描述:
对 n!将其分解成质因子的乘积形式
比如 5!= 2^3 * 3^1 * 5^1; 题目来自acwing
分析:
对于1~n中每一个数进行分解
其中得到质因子2个数为
n/2^1 + n/2^2 + n/2^3 + ……
以此类推
得到 每个质因子p的个数为
n/p^1 + n/p^2 + n/p^3 ……
#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
typedef long long LL;
int primes[N], cnt;
bool st[N];
LL ans[N];
//线性筛法筛质数
void init(int n)
{
for(int i = 2; i <= n; i ++)
{
if(!st[i]) primes[cnt ++] = i;
for(int j = 0; primes[j] * i <= n; j ++)
{
st[primes[j] * i] = true;
if(i % primes[j] == 0) break;
}
}
}
int main()
{
int n;
scanf("%d", &n);
init(n);
//求每一个质因子的个数
for(int i = 0; i < cnt; i ++)
{
int p = primes[i];
int res = 0;
for(int j = n; j; j /= p) res += j/p;
printf("%d %d\n", primes[i], res);
}
return 0;
}
应用:
题目描述:
求满足等式 1/x + 1/y = 1/n!(x,y)的对数,其中x, y, n均为正整数 n<= 1e6
分析:
将原式化为y关于x的函数
y = x * n! / (x - n!)
进一步化为
y = n! + (n!)^2 / (x - n!)
分类讨论 当 x < n! 时 y < 0 不符合题目条件
则 x > n!
题目化为 求 (n!)^2 约数的个数
一个结论: 一个数x若能写成
x = p1^c1 + p2^c2 + p3^c3 + …… + pn^cn;
(p为质因子)
则其约数的个数为 (c1 + 1)*(c2 + 1)*(c3 + 1)*……(cn + 1)
代码为
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod = 1e9 + 7, N = 1000010;
unordered_map<int, int> m;
int primes[N], cnt;
bool st[N];
void init(int n)
{
for(int i = 2; i <= n; i ++)
{
if(!st[i]) primes[cnt ++] = i;
for(int j = 0; primes[j] * i <= n; j ++)
{
st[primes[j] * i] = true;
if(i % primes[j] == 0) break;
}
}
}
int main()
{
int n;
scanf("%d", &n);
init(n);
LL ans = 1;
for(int i = 0; i < cnt; i ++)
{
LL p = primes[i];
LL res = 0;
for(int j = n; j ; j /= p) res += j / p;
ans = ans * (res * 2 + 1) % mod;
}
printf("%lld\n", ans);
return 0;
}