Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
35814 liuyile 【BJ】T2 C++ 通过 100 1899 MS 372888 KB 2330 2025-01-03 16:35:41

Tests(20/20):


#include <bits/stdc++.h> using namespace std; #define int long long int n; const int s=160; int pr[4],pw[4][210]; int fac[210],iv[210]; int g[160][320][320]; int h[160][320][320]; int f[160][320][320]; const int M=1e9+7; inline int qp(int a,int x){ int res=1; while(x){ if(x&1)res=res*a%M; a=a*a%M; x>>=1; } return res; } inline int inv(int x){return qp(x,M-2);} int p[151]; inline void add(int &x,int y){ if((x+=y)>=M)x-=M; } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("SS.in","r",stdin); // freopen("SS.out","w",stdout); cin>>n; for(int i=0;i<4;i++){ cin>>pr[i]; pw[i][0]=1; for(int j=1;j<=n;j++) pw[i][j]=pw[i][j-1]*pr[i]%M; } fac[0]=iv[0]=1; for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%M,iv[i]=inv(fac[i]); g[0][s][s]=1; for(int i=0;i<=n;i++) for(int x=-i;x<=i;x++) for(int y=abs(x)-i;y<=i-abs(x);y++){ add(g[i+1][s+x-1][s+y],g[i][s+x][s+y]*pr[0]%M); add(g[i+1][s+x+1][s+y],g[i][s+x][s+y]*pr[1]%M); add(g[i+1][s+x][s+y-1],g[i][s+x][s+y]*pr[2]%M); add(g[i+1][s+x][s+y+1],g[i][s+x][s+y]*pr[3]%M); } int E=1; p[0]=1; for(int i=1;i<=n;i++){ p[i]=1; for(int j=0;j<i;j++) add(p[i],M-p[j]*g[i-j][s][s]%M); add(E,p[i]); } h[0][s][s]=1; for(int i=0;i<=n;i++) for(int x=-i;x<=i;x++) for(int y=abs(x)-i;y<=i-abs(x);y++){ h[i][s+x][s+y]=g[i][s+x][s+y]; for(int j=0;j<i;j++) add(h[i][s+x][s+y],M-h[j][s+x][s+y]*g[i-j][s][s]%M); } f[0][s][s]=1; for(int i=1;i<=n;i++) for(int j=0;j<i;j++) for(int x=-(i-j);x<=(i-j);x++) for(int y=-(i-j-abs(x));abs(x)+abs(y)<=i-j;y++) add(f[i][s+x][s+y],(p[j]-f[j][s-x][s-y]+M)*h[i-j][s+x][s+y]%M); int E2=0; for(int i=1;i<=n;i++) for(int x=-i;x<=i;x++) for(int y=abs(x)-i;y<=abs(x)+i;y++) if(x!=0||y!=0) add(E2,f[i][s+x][s+y]); E2=(E2*2+E)%M; cout<<(E2-E*E%M+M)%M<<endl; return 0; } /* */


测评信息: