福建省高速公路建设管理网站/常见的搜索引擎有哪些?
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;
}