【NOIP模拟考三】水资源 day2 first 序列计数

题目描述

输入

两个整数m和k

输出

输出一个整数

样例输入

 (如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)

5 3

样例输出

10

提示

    自己挖的坑,死都要填完。。。Orz

    话说才写到模拟考三,模拟考五都已经考完了。。。(貌似一和二只写了几道题QAQ)

    这一道真的是水题。。。第k小的方式肯定是a、a、a...a+1、a+1、a+1...这样的形式,而a+1的个数,恰好等于(k-1)%m(显而易见不想证明),这样就变成了一道很简单的可重复排列,由于只有俩元素,可以当成是组合计算。。。答案就是C(m,(k-1)%m),用一个O(m)算阶乘和逆元就好了啦。。。时间复杂度O(m)。

    PS:要不是为了格式整齐划一我才不会写这种水题嘞!

    代码还是要放的。。。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define mod 998244353
#define N 10000005
#define ll long long
ll ksm(ll a,int k)
{
    if(!k)
        return 1;
    ll p=ksm(a,k/2);
    if(k&1)
        return p*p%mod*a%mod;
    else
        return p*p%mod;
}
int m,k;
int C(int m,int n)
{
    ll a=1,b=1,c=1;
    for(int i=1;i<=m;i++)
        a=a*i%mod;
    for(int i=1;i<=n;i++)
        b=b*i%mod;
    for(int i=1;i<=m-n;i++)
        c=c*i%mod;
    return int(a*ksm(b*c%mod,mod-2)%mod);
}
int main()
{
    //freopen("count.in","r",stdin);
    //freopen("count.out","w",stdout);
    scanf("%d%d",&m,&k);
    k--;k%=m;
    printf("%d",C(m,k));
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值