GMOJ P3504 【运算符】

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!(b1)×(a1)!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 1n1000,1k100

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[i1][j][k]+f[i][j1][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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值