万年div2abc选手补题时间
昨天打比赛的时候,以为是dp+状态压缩;卡了半个小时;
后来才发现,只是一道推公式题目。
首先我们先在m选取n-1个数字作为其值域,共有C(n-1,m)种可能;
然后我们确定重复的数据k,则k可能为1~n-2个;
最后我们还有n-3个数没有确定好;
这n-3个数的位置只有两种选择:左||右;一共有2^(n-3)中可能;
最后一共有(n-2)*C(n-1,m)*2^(n-3)种可能。
注意特判n == 2,否则会WA一个点
code:
#include<iostream>
#define ll long long
#define mod 998244353
using namespace std;
ll qpow(ll x,ll y)
{
ll ans = 1,base = x;
while(y)
{
if(y & 1) ans = (ans * base) % mod;
base = (base * base) % mod;
y >>= 1;
}
return ans;
}
ll inv(ll x)
{
return qpow(x,mod-2);
}
int f[200010];
int main()
{
ll n,m;
cin>>n>>m;
if(n == 2){
cout<<0<<endl;
return 0;
}
f[0] = 1;
for(ll i=1;i<=200000;i++)
{
f[i] = (f[i-1]*i)%mod;
}
ll ans1 = qpow(2,n-3);
ll ans2 = f[m]*inv(f[m-n+1])%mod*inv(f[n-1])%mod;
cout<<((n-2)*ans1%mod*ans2)%mod<<endl;
}