我也就只能会这种简单组合题了
long__long · · 题解
歌挺好听的。
为了说明方便,我们用“数”表示“物品”,“
首先理解题意,这种选的方式会使所有的
设
对于
如果
若我们可以把所有数选掉,即
若我们不能选掉所有数,且
若我们不能选掉所有数,且
如果
于是这题就分讨完了。
写的时候稍微注意一下边界,阶乘和阶乘逆元预处理一下。
不知道为什么我又想放代码了。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mod 998244353
#define N 10000010
int n,m,f[N],inv[N],ans=1;
int qp(int a,int b){
int res=1;
while(b){
if(b&1)(res*=a)%=mod;
(a*=a)%=mod;
b>>=1;
}
return res;
}
int C(int a,int b){
return f[a]*inv[b]%mod*inv[a-b]%mod;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n>>m;
f[0]=1;
for(int i=1;i<=n;i++)f[i]=f[i-1]*i%mod;
inv[n]=qp(f[n],mod-2);
for(int i=n-1;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;
for(int i=1;i<m&&i<=n;i++)
if(i+(n-i)*2<=m)(ans+=C(n,i))%=mod;
else if((m+i)%2)
(ans+=C((m+i-1)/2,i))%=mod;
else{
(ans+=C((m+i)/2,i))%=mod;
(ans+=C((m+i)/2-1,i-1)*(n-(m+i)/2))%=mod;
}
if(m<=n)(ans+=qp(2,n-m+1)-1)%=mod;
cout<<ans<<'\n';
return 0;
}