codeforces1312D Count the Arrays
程序员文章站
2024-03-15 21:16:54
...
https://codeforces.com/problemset/problem/1312/D
傻逼题写了80分钟,留下了不会组合的泪水.jpg
突然想到一般组合题都是从整体考虑就行了,然后就是傻逼题了
从m个数字里取出n-1个值作为这个序列的所有值,C(m,n-1)
其中最大的值只能做 i
而剩下的n-2个值可以在左边或者右边,2^(n-2)
然后那个相等的值可以在这n-2个值里选一个,放在对边,因为每一边只能是单调的,相等的只能在i的两边,*(n-2)
因为相等造成的重复, /2
#include<bits/stdc++.h>
using namespace std;
const int maxl=3e5+10;
const int mod=998244353;
typedef long long ll;
ll n,m,ans,a,b;
ll jc[maxl],inv[maxl];
char s[maxl];
inline ll qp(ll a,ll b)
{
ll ans=1,cnt=a;
while(b)
{
if(b&1)
ans=ans*cnt%mod;
cnt=cnt*cnt%mod;
b>>=1;
}
return ans;
}
inline void prework()
{
//scanf("%lld%lld",&a,&b);
scanf("%lld%lld",&n,&m);
jc[0]=1;
for(int i=1;i<maxl;i++)
jc[i]=jc[i-1]*i%mod;
inv[maxl-1]=qp(jc[maxl-1],mod-2);
for(int i=maxl-2;i>=0;i--)
inv[i]=inv[i+1]*(i+1)%mod;
}
inline ll c(int n,int r)
{
if(r>n) return 0;
if(r<0) return 0;
if(r==0) return 1;
return jc[n]*inv[n-r]%mod*inv[r]%mod;
}
inline void mainwork()
{
}
inline void print()
{
//printf("%lld\n",ans);
ans=c(m,n-1)*qp(2,n-2)%mod*(n-2)%mod*qp(2,mod-2)%mod;
printf("%lld",ans);
}
int main()
{
int t=1;
//scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}