/* 开始想的是 维护a的每个指数的系数 然而不好办 然而还有^10^10^10这种数据 特殊值带入吧 多搞几个素数 接下来就是玄学的事了 给a赋值之后 就是简单地表达式求值 虽然思路简单 但是字符串一向很恶心、、 数据括号有问题。。。。 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 255 #define mod 10007 using namespace std; int n,a,top1,top2,l,li,s1[maxn],s2[maxn]; int ans[6]={0,1007,1607,1847,2711,2713}; int target[6]; int order[100]; char s[maxn],si[maxn],c; int Mi(int x,int y) { int ans=x; for(int i=2;i<=y;i++) ans=(ans*x)%mod; return ans; } int Go(int x,int y,char z) { if(z==45)return (x-y+mod)%mod; if(z==43)return (x+y)%mod; if(z==42)return (x*y)%mod; if(z==94)return Mi(x,y); } int main() { order[45]=order[43]=1; order[42]=2;order[94]=3; gets(si);li=strlen(si+1);l=0; for(int i=0;i<=li;i++) if(si[i]==' ')continue; else s[++l]=si[i]; s[0]='(';s[++l]=')'; for(int k=1;k<=5;k++) { a=ans[k];int i=0;top1=top2=0; memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); while(i<=l) { if(s[i]=='a') { if(top1>=1&&s[i-1]>='0'&&s[i-1]<='9') { int tmp=s1[top1]; s1[top1]=a*tmp%mod; } else top1=top1+1,s1[top1]=a; } if(s[i]>='0'&&s[i]<='9') { int x=0; while(s[i]>='0'&&s[i]<='9'){x=x*10+s[i]-'0';i++;} top1=top1+1;s1[top1]=x;i=i-1; } else { if(s[i]=='(')top2=top2+1,s2[top2]=s[i]; if(s[i]=='^') { int x=0;i=i+1;int r=s1[top1]; while(s[i]>='0'&&s[i]<='9'){x=x*10+s[i]-'0';i++;} s1[top1]=Go(r,x,'^');i=i-1; } if(s[i]=='+'||s[i]=='-'||s[i]=='*') { if(order[s[i]]<=order[s2[top2]]) { while(order[s[i]]<=order[s2[top2]]) { int r1=s1[top1];top1=top1-1; int r2=s1[top1];top1=top1-1; int r3=Go(r2,r1,s2[top2]); top2=top2-1;top1=top1+1;s1[top1]=r3; } top2=top2+1;s2[top2]=s[i]; } else if(order[s[i]]>order[s2[top2]])top2=top2+1,s2[top2]=s[i]; } if(s[i]==')') { while(s2[top2]!='('&&top2) { int r1=s1[top1];top1=top1-1; int r2=s1[top1];top1=top1-1; int r3=Go(r2,r1,s2[top2]); top2=top2-1;top1=top1+1;s1[top1]=r3; } top2=top2-1; } } i=i+1; } target[k]=s1[1]; } scanf("%d",&n);c=getchar(); for(int p=1;p<=n;p++) { li=0;memset(si,0,sizeof(si)); gets(si);li=strlen(si+1);l=0; for(int i=0;i<=li;i++) if(si[i]==' ')continue; else s[++l]=si[i]; s[0]='(';s[++l]=')';int sum=0; for(int k=1;k<=5;k++) { a=ans[k];int i=0;top1=top2=0; memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); while(i<=l) { if(s[i]=='a') { if(top1>=1&&s[i-1]>='0'&&s[i-1]<='9') { int tmp=s1[top1]; s1[top1]=a*tmp%mod; } else top1=top1+1,s1[top1]=a; } if(s[i]>='0'&&s[i]<='9') { int x=0; while(s[i]>='0'&&s[i]<='9'){x=x*10+s[i]-'0';i++;} top1=top1+1;s1[top1]=x;i=i-1; } else { if(s[i]=='(')top2=top2+1,s2[top2]=s[i]; if(s[i]=='^') { int x=0;i=i+1;int r=s1[top1]; while(s[i]>='0'&&s[i]<='9'){x=x*10+s[i]-'0';i++;} s1[top1]=Go(r,x,'^');i=i-1; } if(s[i]=='+'||s[i]=='-'||s[i]=='*') { if(order[s[i]]<=order[s2[top2]]) { while(order[s[i]]<=order[s2[top2]]) { int r1=s1[top1];top1=top1-1; int r2=s1[top1];top1=top1-1; int r3=Go(r2,r1,s2[top2]); top2=top2-1;top1=top1+1;s1[top1]=r3; } top2=top2+1;s2[top2]=s[i]; } if(order[s[i]]>order[s2[top2]])top2=top2+1,s2[top2]=s[i]; } if(s[i]==')') { while(s2[top2]!='('&&top2) { int r1=s1[top1];top1=top1-1; int r2=s1[top1];top1=top1-1; int r3=Go(r2,r1,s2[top2]); top2=top2-1;top1=top1+1;s1[top1]=r3; } top2=top2-1; } } i=i+1; } if(s1[1]==target[k])sum++; } if(sum==5)printf("%c",'A'-1+p); } return 0; }