Description
定义新运算 “ ! ! !” ,运算规则如下:
a
!
b
=
{
a
!
b
=
a
!
(
b
−
1
)
×
(
a
−
1
)
!
b
a
>
0
,
b
>
0
a
!
b
=
1
a
=
0
a
!
b
=
a
b
=
0
a!b=\begin{cases}a!b = a!(b-1) \times (a-1)!b & \; a> 0,b > 0 \\a!b = 1 & \; a = 0 \\a!b = a & \; b = 0 \\\end{cases}
a!b=⎩⎪⎨⎪⎧a!b=a!(b−1)×(a−1)!ba!b=1a!b=aa>0,b>0a=0b=0
。
给你两个正整数 n n n 和 k k k ,现在请你求出 n ! k n!k n!k 的因子个数 m o d ( 1 0 9 + 9 ) \mod (10^9+9) mod(109+9) 。
1 ≤ n ≤ 1000 , 1 ≤ k ≤ 100 1\leq n\leq 1000,1 \leq k \leq 100 1≤n≤1000,1≤k≤100 。
Solution
考虑使用 递推 来解题。
设 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k] 表示 i ! j i ! j i!j 分解质因数后的第 k k k 个 质数 的指数的值,那显然有:
f [ i ] [ j ] [ k ] = ( f [ i − 1 ] [ j ] [ k ] + f [ i ] [ j − 1 ] [ k ] ) m o d ( 1 0 9 + 9 ) f[i][j][k]=(f[i-1][j][k]+f[i][j-1][k])\mod(10^9+9) f[i][j][k]=(f[i−1][j][k]+f[i][j−1][k])mod(109+9)
。
若一个数 n = p 1 k 1 × p 2 k 2 × . . . × p m k m n=p_1^{k_1} \times p_2^{k_2} \times ... \times p_m^{k_m} n=p1k1×p2k2×...×pmkm ,其中 p 1 p_1 p1 ~ p m p_m pm 均为质数,那么 n n n 的因子个数为 ∏ i = 1 m ( k i + 1 ) \prod_{i=1}^m (k_i+1) ∏i=1m(ki+1) 。
所以我们可以得出答案等于 ( ∏ i = 1 n ( f [ n ] [ k ] [ i ] + 1 ) ) m o d ( 1 0 9 + 9 ) (\prod_{i=1}^{n}(f[n][k][i]+1)) \mod\;(10^9+9) (∏i=1n(f[n][k][i]+1))mod(109+9) 。
记得要中途取模!
时间复杂度 O ( n k ) O(nk) O(nk),具体细节详见 代码 部分。
然后这道题目就做完了。
Code
#include<cstdio>
const int N=1e9+9;
int n,m,a[169],len;
int f[1001][101][169];
long long int ans=1;
bool bz[1001];
int main()
{
scanf("%d%d",&n,&m);
a[++len]=2;
for(int i=3;i<=n;i+=2)
{
if(bz[i]==false)
{
a[++len]=i;
for(int j=3;j<=n/i;j+=2)
{
bz[i*j]=true;
}
}
}
for(int i=1;i<=n;i++)
{
int x=i;
for(int j=1;j<=len&&a[j]<=i;j++)
{
while(x%a[j]==0)x/=a[j],f[i][0][j]++;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
for(int k=1;k<=len;k++)
{
f[i][j][k]=(f[i-1][j][k]+f[i][j-1][k])%N;
}
}
}
for(int i=1;i<=len;i++)
{
ans=(ans*(f[n][m][i]+1))%N;
}
printf("%d",ans);
return 0;
}