样例过了。
#include<bits/stdc++.h>
using namespace std;
int n,m,r,tp;
char s[100005],st[100005];
int pri(char c){return c=='*'?2:(c!='(');}
int id(char c){return c=='*'?3:(c=='-')+1;}
struct node{
int x,y,op;
}res[100005],st2[100005];
int main(){
// freopen("zhizhi.in","r",stdin);
// freopen("zhizhi.out","w",stdout);
scanf("%s%d%d",s+1,&r,&m);
for(int i=1;s[i];i++){
if(isdigit(s[i])){
int x=s[i]^48;
while(isdigit(s[i+1]))x=(x*10%m+(s[++i]^48))%m;
res[++n]={0,x%m,0};
}
else if(s[i]=='x')res[++n]={1,0,0};
else if(s[i]=='(')st[++tp]='(';
else if(s[i]==')'){
while(st[tp]!='(')res[++n]={0,0,id(st[tp--])};
tp--;
}
else{
while(tp && pri(st[tp])>=pri(s[i]))res[++n]={0,0,id(st[tp--])};
st[++tp]=s[i];
}
}
while(tp)res[++n]={0,0,id(st[tp--])};
for(int i=1;i<=n;i++){
if(res[i].op){
assert(tp>=2);
node a=st2[tp--];
node b=st2[tp--];
if(res[i].op==1)st2[++tp]={(a.x+b.x)%m,(a.y+b.y)%m,0};
else if(res[i].op==2)st2[++tp]={(a.x-b.x+m)%m,(a.y-b.y+m)%m,0};
else if(!a.x)st2[++tp]={int(1ll*a.y*b.x%m),int(1ll*a.y*b.y%m),0};
else st2[++tp]={int(1ll*b.y*a.x%m),int(1ll*a.y*b.y%m),0};
}
else st2[++tp]=res[i];
}
for(int i=1;i<=m;i++)if((1ll*i*st2[1].x%m+st2[1].y)%m==r){printf("%d",i);return 0;}
}