表达式求值(noip2015等价表达式)
题目大意
给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些
做法
模拟一个多项式显然难以实现
那么我们高兴的找一些素数代入表达式,再随便找一个素数做模
表达式求值优先级表
( | ) | + | - | * | ^ | |
---|---|---|---|---|---|---|
( | < | = | < | < | < | < |
) | ||||||
+ | < | > | > | > | < | < |
- | < | > | > | > | < | < |
* | < | > | > | > | > | < |
^ | < | > | > | > | > | > |
void print(int x)
{
for(int i=1;i<A;i++) if(tmp[i]!=ans[i]) return;
printf("%c",'A'+x);
}
LL yusuan(LL a,LL b,int x)
{
if(x3) return (a+b)%Q;
if(x4) return ((a-b)%Q+Q)%Q;
if(x5) return (a*b)%Q;
if(x6)
{
LL res=1;
while(b--) res=(res*a)%Q;
return res;
}
}
void calc(LL to)
{
int n=0,len=strlen(t),i,j,x;LL d;
for(i=0;i<len;i++) if(t[i]!=' ') s[++n]=t[i];
stopr=0;stnum=0;
s[0]='(';s[++n]=')';
for(i=0;i<=n;i++)
{
if(chg[s[i]])
{
x=chg[s[i]];
while(stopr&&cmp[opr[stopr]][x]'>')
{
stnum--;
for(j=1;j<A;j++) num[j][stnum]=yusuan(num[j][stnum],num[j][stnum+1],opr[stopr]);
stopr--;
}
if(stopr&&cmp[opr[stopr]][x]'=') stopr--;
else opr[++stopr]=x;
}
else
{
if(s[i]=='a')
{
++stnum;
for(j=1;j<A;j++) num[j][stnum]=p[j];
}
else
{
d=0;
for(;isdigit(s[i]);i++) d=(d10+s[i]-'0')%Q;
i--;
++stnum;
for(j=1;j<A;j++) num[j][stnum]=d;
}
}
}
for(i=1;i<A;i++) to[i]=num[i][1];
}
int main()
{
chg['(']=1;chg[')']=2;
chg['+']=3;chg['-']=4;
chg['*']=5;chg['^']=6;
int i;
gets(t);
calc(ans);
scanf("%d",&m);getchar();
for(i=0;i<m;i++)
{
gets(t);
calc(tmp);
print(i);
}
return 0;
}