0 分玄关求调
查看原帖
0 分玄关求调
866154
fcy20180201楼主2024/8/16 21:36

样例过了。

#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;}	
}
2024/8/16 21:36
加载中...