题解:CF1764D Doremy's Pegging Game
lzx20120124 · · 题解
题目
考虑连续移除多少个红色钉子会使橡皮筋碰到蓝色钉子。
我们把第一个红色钉子(
就这样子连边(移除
我们发现当
于是设在结束时有连续
可以发现最后一个移除的钉子只有
最后统计一下贡献
但是当
最后时间复杂度
:::success[code]
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,l,r) for(int i=(l);i<=(r);++i)
#define per(i,r,l) for(int i=(r);i>=(l);--i)
const int N=5005;
int n,mod;
ll fac[N],inv[N],C[N][N];
ll pom(ll a,ll b){ll res=1;for(;b;b>>=1,a=a*a%mod) if(b&1)res=res*a%mod;}
void solve(){
cin>>n>>mod;
fac[0]=1;
rep(i,1,n) fac[i]=fac[i-1]*i%mod;
rep(i,0,n){C[i][0]=1,C[i][i]=1;rep(j,1,i-1) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;}
int m=n>>1;
ll ans=0;
rep(x,m,n-2)
rep(y,0,n-x-2)
ans=(ans+n*fac[x+y-1]*(m+m-x)%mod*C[n-x-2][y]%mod)%mod;
if(n%2==0) ans=(ans+n*fac[n-2])%mod;
cout<<ans<<'\n';
}
int main(){
cin.tie(0)->ios::sync_with_stdio(false);
solve();
}
:::