提交时间:2024-12-11 14:35:58
运行 ID: 35419
#include <bits/stdc++.h> using namespace std; #define int long long #define i128 __int128_t #define endl "\n" int n,q; bool p[4][150]; int s[4]; inline i128 gcd(i128 a,i128 b){ return b==0?a:gcd(b,a%b); } i128 f[130][61][61]; i128 g[130][61][61]; inline void prt(i128 x){ stack<char>p; while(x)p.push(x%10+'0'),x/=10; while(!p.empty())cout<<p.top(),p.pop(); } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("SS.in","r",stdin); // freopen("SS.out","w",stdout); int t; cin>>t; while(t--){ cin>>n>>q; // cout<<n<<" "<<q<<endl; // cout.flush(); for(int i=1;i<=n;i++){ for(int j=1;j<=q;j++){ char x; cin>>x; if(x=='T')p[i][j]=1; else p[i][j]=0; // cout<<p[i][j]; } cin>>s[i]; if(s[i]*2>q){ for(int j=1;j<=q;j++) p[i][j]^=1; s[i]=q-s[i]; } } if(n==1){ for(int i=1;i<=q;i++) if(p[1][i])cout<<"F"; else cout<<"T"; cout<<" "<<q-s[1]<<"/"<<1<<endl; n=q=-1; continue; } else if(n==2){ for(int i=0;i<=q+1;i++) for(int j=0;j<=q/2;j++) for(int k=0;k<=q/2;k++) g[i][j][k]=f[i][j][k]=0; f[0][0][0]=1; for(int i=1;i<=q;i++) for(int j=0;j<i&&j<=q/2;j++) for(int k=0;k<i&&k<=q/2;k++) for(int w=0;w<=1;w++) f[i][j+(w==p[1][i])][k+(w==p[2][i])]+=f[i-1][j][k]; // cout<<(int)f[q][s[1]][s[2]]<<endl; g[q+1][0][0]=1; for(int i=q;i>=1;i--) for(int j=0;j<q-i+1&&j<=q/2;j++) for(int k=0;k<q-i+1&&k<=q/2;k++) for(int w=0;w<=1;w++) g[i][j+(w==p[1][i])][k+(w==p[2][i])]+=g[i+1][j][k]; // cout<<(int)g[1][s[1]][s[2]]<<endl; i128 res=0; i128 tot=f[q][s[1]][s[2]]; for(int i=1;i<=q;i++){ i128 mx[2]; for(int w=0;w<=1;w++){ int a=s[1]-(w==p[1][i]),b=s[2]-(w==p[2][i]); i128 ct=0; for(int j=0;j<=a;j++) for(int k=0;k<=b;k++) ct+=f[i-1][j][k]*g[i+1][a-j][b-k]; mx[w]=ct; } if(mx[1]>mx[0])cout<<"T"; else cout<<"F"; res+=max(mx[1],mx[0]); } // cout<<(int)res<<" "<<(int)tot<<endl; // cout.flush(); i128 t=gcd(res,tot); res/=t,tot/=t; cout<<" "; prt(res),cout<<"/"; prt(tot),cout<<endl; } } cout.flush(); return 0; }