JZOJ 3504. 运算符(calc)

题目

Description

鸡腿想到了一个很高(sha)明(bi)的运算符,那就是’!’,没错就是感叹号。他给了如下的定义:

1、n!k = n!(k-1) * (n-1)!k (n> 0 and k > 0)

2、n!k = 1 (n = 0)

3、n!k = n (k = 0)

现在鸡腿告诉你n和k你能告诉他n!k的不同约数个数有多少个吗?只要对1,000,000,009取模就可以了哦!
 

Input

一行,输入两个正整数n,k。

Output

一行,输出一个整数表示答案。
 

Sample Input

输入1:
3 1
输入2:
100 2

Sample Output

输出1:
4
输出2:
321266186
 

Data Constraint

对于30%的数据0 <n ≤ 10, 0 <k ≤ 10;

对于100%的数据0 <n ≤ 1000, 0 <k ≤ 100。

 

分析

 

  • 这道题显然我们需要先找规律
  • 这里一个矩阵,代表
  • 1 1 1 1 1
  • 2 2 2 2 2
  • 6 12 24 48
  • 24 288....
  • 所以当前数等于左边乘上面
  • 左边一列是阶乘
  • 然后我们要求的是约数个数
  • 就要分解质因数
  • 我们举个例子,24=4*6; 4=2^2,6=2*3 24=2^3*3
  • 所以我们知道两个数相乘,质因子是相加的
  • 所以设f[i][j][k]为到第i行j列第k个质因子转移显然

 

代码

 1 #include<iostream>
 2 using namespace std;
 3 const long long mod=1000000009;
 4 int f[1001][101][170],prime[1001],cnt;
 5 bool vis[1001];
 6 int n,kk;
 7 int main ()
 8 {
 9     for (int i=2;i<=1000;i++)
10       if (!vis[i])
11       {
12            prime[++cnt]=i;
13            for (int j=i+i;j<=1000;j+=i)
14            vis[j]=1;
15       }
16     cin>>n>>kk;
17     for (int i=1;i<=n;i++)
18         for (int j=1;j<=cnt;j++)
19         {
20             long long now=prime[j],t=i/now,t1=0;
21             if (t==0) break;
22             while (t) t1=(t1+t)%mod,t/=now;
23             f[i][1][j]=t1%mod;
24         }
25     for (int i=2;i<=n;i++)
26       for (int j=2;j<=kk;j++)
27         for (int k=1;k<=cnt;k++)
28           f[i][j][k]=(f[i-1][j][k]+f[i][j-1][k])%mod;
29     long long ans=1;
30     for (int k=1;k<=cnt;k++)
31        ans=ans*(f[n][kk][k]+1)%mod;
32     cout<<ans;
33 }

 

 

posted @ 2019-08-18 07:55  Melted_czj  阅读(172)  评论(0编辑  收藏  举报
body { background-color:whitesmoke; } // 修改背景颜色为半透明 #home,#sideBarMain>div,#blog-sidecolumn>div>div,.catListView{ background-color:rgba(255,255,255,0); } // 修改其他边框的颜色