Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
35424 | baka24 | 【BJ】T1 | C++ | 运行出错 | 75 | 125 MS | 4516 KB | 4965 | 2024-12-11 15:21:43 |
#include<bits/stdc++.h> using namespace std; #define int long long int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=150,N=50; int n,m,a[MAXN],p[MAXN],q[MAXN][2]; char s[4][MAXN]; // #define __int128 int #define it __int128 int gcd(int x,int y){return !x||!y?x|y:gcd(y%x,x);} struct node{ it x,y; node operator+(const node&G)const{ if(!y||!G.y)return (node){0,1}; node res; res.y=y/gcd(y,G.y)*G.y; res.x=x*res.y/y+G.x*res.y/G.y; int g=gcd(res.x,res.y); res.y/=g,res.x/=g; return res; } }ans; #define pb push_back void write(it x){ if(!x){ putchar('0'); return; } vector<int>G;G.clear(); while(x)G.pb(x%10),x/=10; for(int i=G.size()-1;~i;i--)putchar(G[i]+'0'); } it f[N][N][N],g[N][N][N]; void slv2(){ memset(f,0,sizeof(f)),memset(g,0,sizeof(g)); f[0][0][0]=1;g[m+1][0][0]=1; for(int i=1;i<=m;i++){ for(int j=0;j<=a[1];j++){ for(int k=0;k<=a[2];k++){ f[i][j+(s[1][i]=='F')][k+(s[2][i]=='F')]+=f[i-1][j][k]; f[i][j+(s[1][i]=='T')][k+(s[2][i]=='T')]+=f[i-1][j][k]; } } } for(int i=m;i>=1;i--){ for(int j=0;j<=a[1];j++){ for(int k=0;k<=a[2];k++){ g[i][j+(s[1][i]=='F')][k+(s[2][i]=='F')]+=g[i+1][j][k]; g[i][j+(s[1][i]=='T')][k+(s[2][i]=='T')]+=g[i+1][j][k]; } } } ans={0,1}; for(int i=1;i<=m;i++){ it F=0,T=0; for(int j=0;j<=a[1];j++){ for(int k=0;k<=a[2];k++){ if(j+(s[1][i]=='F')<=a[1]&&k+(s[2][i]=='F')<=a[2]) F+=f[i-1][j][k]*g[i+1][a[1]-j-(s[1][i]=='F')][a[2]-k-(s[2][i]=='F')]; if(j+(s[1][i]=='T')<=a[1]&&k+(s[2][i]=='T')<=a[2]) T+=f[i-1][j][k]*g[i+1][a[1]-j-(s[1][i]=='T')][a[2]-k-(s[2][i]=='T')]; } } if(F>T)printf("F"),ans=ans+(node){F,F+T}; else printf("T"),ans=ans+(node){T,F+T}; } putchar(' '); write(ans.x); putchar('/'); write(ans.y); putchar('\n'); } void slv1(){ if(a[1]>=m-a[1])printf("%s %lld",s[1]+1,a[1]); else { for(int i=1;i<=m;i++)printf("%c",s[1][i]=='T'?'F':'T'); printf(" %lld",m-a[1]); } printf("/1\n"); } it C[MAXN][MAXN]; int c1=0,c2=0,c3=0; it calc(int x){ // cout<<x<<" "<<c1<<" "<<c2<<" "<<c3<<":"<<endl; it res=0; for(int i=0;i<=c1;i++){ int b=2*i+c2-c1+a[2]-a[1],c=2*i+c3-c1+a[3]-a[1]; if(b&1||c&1||b>>1>c2||c>>1>c3)continue; b>>=1,c>>=1; int c4=a[1]+a[2]+2*c-c1-c2-2*c3; if(c4&1||c4>>1>m-1-c1-c2-c3)continue; c4>>=1; // cout<<" "<<i<<" "<<b<<" "<<c<<" "<<c4<<endl; // cout<<" "<<i+c2-b+c3-c+c4<<" "; // cout<<" "<<c1-i+b+c3-c+c4<<" "; // cout<<" "<<c1-i+c2-b+c+c4<<endl; res+=C[c1][i]*C[c2][b]*C[c3][c]*C[m-1-c1-c2-c3][c4]; // cout<<C[c1][i]<<" "<<C[c2][b]<<" "<<C[c3][c]<<" "<<C[m-1-c1-c2-c3][c4]<<endl; } // cout<<(int)res<<endl; return res; } void slv3(){ ans={0,1}; c1=c2=c3=0; for(int i=1;i<=m;i++) c1+=s[1][i]!=s[2][i]&&s[2][i]==s[3][i], c2+=s[2][i]!=s[1][i]&&s[1][i]==s[3][i], c3+=s[3][i]!=s[2][i]&&s[2][i]==s[1][i]; for(int i=1;i<=m;i++){ it T=0,F=0; c1-=s[1][i]!=s[2][i]&&s[2][i]==s[3][i], c2-=s[2][i]!=s[1][i]&&s[1][i]==s[3][i], c3-=s[3][i]!=s[2][i]&&s[2][i]==s[1][i]; a[1]-=s[1][i]=='T'; a[2]-=s[2][i]=='T'; a[3]-=s[3][i]=='T'; if(a[1]>=0&&a[2]>=0&&a[3]>=0)T=calc(i); a[1]+=s[1][i]=='T'; a[2]+=s[2][i]=='T'; a[3]+=s[3][i]=='T'; a[1]-=s[1][i]=='F'; a[2]-=s[2][i]=='F'; a[3]-=s[3][i]=='F'; if(a[1]>=0&&a[2]>=0&&a[3]>=0)F=calc(i); a[1]+=s[1][i]=='F'; a[2]+=s[2][i]=='F'; a[3]+=s[3][i]=='F'; c1+=s[1][i]!=s[2][i]&&s[2][i]==s[3][i], c2+=s[2][i]!=s[1][i]&&s[1][i]==s[3][i], c3+=s[3][i]!=s[2][i]&&s[2][i]==s[1][i]; // cout<<(int)T<<" "<<(int)F<<endl; if(F>T)printf("F"),ans=ans+(node){F,F+T}; else printf("T"),ans=ans+(node){T,F+T}; } putchar(' '); write(ans.x); putchar('/'); write(ans.y); putchar('\n'); } void slv(){ n=read(),m=read(); for(int i=1;i<=n;i++)scanf("%s",s[i]+1),a[i]=read(); if(n==1)slv1(); else if(n==2)slv2(); else slv3(); } signed main(){ // freopen("exam.in","r",stdin);freopen("exam.out","w",stdout); C[0][0]=1; for(int i=1;i<MAXN;i++){C[i][0]=1;for(int j=1;j<=i;j++)C[i][j]=C[i-1][j-1]+C[i-1][j];} int _=read();while(_--) slv(); return 0; }