提交时间:2024-12-11 13:22:05

运行 ID: 35417

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; typedef __uint128_t i128; const int maxn=1e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,q; string s[4]; int cnt[4]; int fi,fj,fk,ff; i128 C[155][155]; void init(){ C[0][0]=1; up(i,1,150)up(j,0,i)C[i][j]=C[i-1][j]+(j?C[i-1][j-1]:0); } i128 get_ans(){ if(cnt[1]<0||cnt[2]<0||cnt[3]<0)return 0; if(n==1)return C[fi][cnt[1]]; if(n==2){ int B=cnt[1]-cnt[2]; if((B+fi)%2!=0)return 0; int a=(B+fi)/2; if(a<0||a>q)return 0; if(cnt[1]-a<0)return 0; return C[fi][a]*C[ff][cnt[1]-a]; } i128 res=0; up(a,0,q){ int B=cnt[1]-cnt[2]; int b=2*a+fj-fi-B; if(b<0||(b%2)!=0)continue; b/=2;if(b>q)continue; int C_=cnt[1]-cnt[3]; int c=2*a+fk-fi-C_; if(c<0||(c%2)!=0)continue; c/=2;if(c>q)continue; int rem=cnt[1]-a-(fj-b)-(fk-c); if(rem<0||rem>q)continue; i128 val=C[fi][a]*C[fj][b]*C[fk][c]*C[ff][rem]; res+=val; }return res; } i128 gcd(i128 a,i128 b){return ((!b)?a:gcd(b,a%b));} struct nd { i128 x,y; nd(i128 _a,i128 _b){ i128 g=gcd(_a,_b); x=_a/g,y=_b/g; } }; nd operator+(nd a,nd b){ assert(a.y==b.y); return nd(a.x+b.x,a.y); //return nd(a.x*b.y+b.x*a.y,a.y*b.y); } void print(i128 a){ if(!a){cout<<"0";return;} vector<char>ch; while(a)ch.p_b(a%(i128)10+'0'),a/=(i128)10; reverse(ch.begin(),ch.end()); for(char x:ch)putchar(x); } void slv(){ n=read(),q=read(); up(i,1,n)cin>>s[i]>>cnt[i],s[i]=" "+s[i]; if(q==1){ if(s[1]==" T"){ if(cnt[1]==1)cout<<"T 1/1"<<endl; else cout<<"F 1/1"<<endl; }else { if(cnt[1]==1)cout<<"F 1/1"<<endl; else cout<<"T 1/1"<<endl; } return; } fi=fj=fk=ff=0; up(i,1,q){ if(n==1)fi++; else if(n==2){ if(s[1][i]==s[2][i])ff++; else fi++; }else { if(s[1][i]==s[2][i]&&s[2][i]==s[3][i])ff++; else if(s[1][i]==s[2][i])fk++; else if(s[1][i]==s[3][i])fj++; else fi++; } } string a="TF"; string ans=""; i128 sum=0,_ans=0; up(i,1,q){ int lfi=fi,lfj=fj,lfk=fk,lff=ff; if(n==1)fi--; else if(n==2){ if(s[1][i]==s[2][i])ff--; else fi--; }else { if(s[1][i]==s[2][i]&&s[2][i]==s[3][i])ff--; else if(s[1][i]==s[2][i])fk--; else if(s[1][i]==s[3][i])fj--; else fi--; } i128 val1=0,val2=0; for(char ch:a){ up(j,1,n)if(s[j][i]==ch)--cnt[j]; i128 ret=get_ans(); if(ch=='T')val1=ret;else val2=ret; up(j,1,n)if(s[j][i]==ch)++cnt[j]; }_ans=val1+val2; if(val1<val2){ ans.p_b('F'); sum=sum+val2; }else { ans.p_b('T'); sum=sum+val1; } fi=lfi,fj=lfj,fk=lfk,ff=lff; } nd res(sum,_ans); cout<<ans<<" "; print(res.x);cout<<"/";print(res.y);cout<<endl; } int main(){ //freopen("exam.in","r",stdin); //freopen("exam.out","w",stdout); init();int t=read();while(t--)slv(); fclose(stdin); fclose(stdout); return 0; }