题目描述
输入
两个整数m和k
输出
输出一个整数
样例输入
(如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)
5 3
样例输出
10
提示
话说才写到模拟考三,模拟考五都已经考完了。。。(貌似一和二只写了几道题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));
}