Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
35440 | baka24 | 【BJ】T1 | C++ | 通过 | 100 | 73 MS | 1936 KB | 4274 | 2024-12-11 17:06:26 |
#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=330,N=330; int n,m,a[MAXN],p[MAXN],q[MAXN][2]; char s[4][MAXN]; // #define __int128 int #define it __int128 it gcd(it x,it y){return !x||!y?x|y:gcd(y%x,x);} struct node{ it x,y; void nd(){ it g=gcd(x,y); x/=g,y/=g; } node operator+(const node&P)const{ node res; res.y=P.y; res.x=x+P.x; 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;//,cout<<G.back()<<" ";cout<<endl; for(int i=G.size()-1;~i;i--)putchar(G[i]+'0'); } it C[MAXN][MAXN]; int c1,c2,c3; it calc2(int x){ int c2=a[1]+a[2]-c1;it res=0; if(c2&1||c2<0||c2>>1>m-1-c1)return 0; c2>>=1; int s=a[1]-c2; return C[c1][s]*C[m-1-c1][c2]; } void slv2(){ ans={0,1}; c1=c2=0; for(int i=1;i<=m;i++)c1+=s[1][i]!=s[2][i]; for(int i=1;i<=m;i++){ it T=0,F=0; c1-=s[1][i]!=s[2][i]; a[1]-=s[1][i]=='T'; a[2]-=s[2][i]=='T'; if(a[1]>=0&&a[2]>=0&&a[3]>=0)T=calc2(i); a[1]+=s[1][i]=='T'; a[2]+=s[2][i]=='T'; a[1]-=s[1][i]=='F'; a[2]-=s[2][i]=='F'; if(a[1]>=0&&a[2]>=0&&a[3]>=0)F=calc2(i); a[1]+=s[1][i]=='F'; a[2]+=s[2][i]=='F'; c1+=s[1][i]!=s[2][i]; // cout<<(int)F<<","<<(int)T<<" "<<(int)(F+T)<<endl; if(F>T) printf("F"), ans=ans+(node){F,F+T}; else printf("T"), ans=ans+(node){T,F+T}; } ans.nd(); 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 calc(int x){ 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||b<0||c<0)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||c4<0)continue; c4>>=1; res+=C[c1][i]*C[c2][b]*C[c3][c]*C[m-1-c1-c2-c3][c4]; } 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}; } ans.nd(); 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; }