题解:CF2134F Permutation Oddness
CF2134F Permutation Oddness
Diff:*2900
有
考虑定义
记
-
k$ 为奇数,记 $k=2m+1 -
以
0 开头。那么0 的连续段有m+1 个,2 的连续段有m 个,分别划分后拼接,方案数为F(c_0,m+1)\times F(c_2,m)=\binom{c_0-1}{m}\binom{c_2-1}{m-1} 。 -
以
2 开头。那么0 的连续段有m 个,2 的连续段有m+1 个,同理方案数为F(c_0,m)\times F(c_2,m+1)=\binom{c_0-1}{m-1}\binom{c_2-1}{m} 。
-
-
k$ 为偶数,记 $k=2m 两者都有
m 个连续段,区分开头顺序有2 种拼接方案,方案数为2\cdot F(c_0,m)\times F(c_2,m)=2\binom{c_0-1}{m-1}\binom{c_2-1}{m-1} 。
再将
那么考虑用
同理可以计算出
时间复杂度是
:::info[代码]
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
inline int Mod(int x) { return x<0 ? x+mod : (x>=mod ? x-mod : x); }
inline void adm(int &x,int y) { x=Mod(x+y); }
inline int qmi(ll a,int b)
{
ll res=1;
for (;b;b>>=1,a=a*a%mod) if (b&1) res=res*a%mod;
return res;
}
const int N=810;
int fac[N],infac[N];
void init(int M=N-1)
{
fac[0]=1; for (int i=1;i<=M;i++) fac[i]=(ll)fac[i-1]*i%mod;
infac[M]=qmi(fac[M],mod-2); for (int i=M-1;~i;i--) infac[i]=(ll)infac[i+1]*(i+1)%mod;
}
int binom(int a,int b)
{
if (a<0 || b<0 || a<b) return 0;
return (ll)fac[a]*infac[b]%mod*infac[a-b]%mod;
}
int c0,c1,c2,c3;
int f[N<<1],r[N][N<<1],b[N][N<<1];
int ans[N<<1];
void work(int x,int y,int g[N][N<<1])
{
memset(f,0,sizeof(f));
for (int m=1;2*m-1<=(x+y)*2;m++)
{
f[m*2]=Mod((ll)binom(x-1,m)*binom(y-1,m-1)%mod+(ll)binom(x-1,m-1)*binom(y-1,m)%mod);
f[m*2-1]=2ll*binom(x-1,m-1)*binom(y-1,m-1)%mod;
}
for (int i=1;i<=x+y;i++)
{
for (int j=0;j<=x+y;j++)
{
for (int k=0;k<=j && k<=i-1;k++)
{
int coef=(ll)binom(j,k)*binom(x+y-1-j,i-1-k)%mod;
adm(g[i][2*(j-k)],(ll)coef*f[j]%mod);
}
}
}
}
void solve()
{
cin >> c0 >> c1 >> c2 >> c3;
memset(r,0,sizeof(r)); work(c0,c2,r);
memset(b,0,sizeof(b)); work(c1,c3,b);
int n=c0+c1+c2+c3;
for (int i=0;i<2*n-1;i++) ans[i]=0;
for (int ir=1;ir<=c0+c2;ir++)
{
for (int ib=ir-1;ib<=ir+1;ib++)
{
if (ib<1 || ib>c1+c3) continue;
for (int jr=0;jr<=2*(c0+c2);jr+=2)
{
for (int jb=0;jb<=2*(c1+c3);jb+=2)
{
int coef=1+(ir==ib);
adm(ans[ir+ib-1+jr+jb],(ll)coef*r[ir][jr]*b[ib][jb]%mod);
}
}
}
}
for (int i=0;i<2*n-1;i++) cout << ans[i] << " ";
cout << "\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
init();
int T; cin >> T;
while (T--) solve();
return 0;
}
:::