SLON

link

很简单的模拟题但数据比较毒瘤,于是考场上成功爆零。

就直接用栈来维护中缀表达式的计算,然后求出一次项系数和常数项之后上扩展欧几里得就可以了。但是它……

数据太大,用龙龙宝宝一分都拿不到。龙龙宝宝多可爱的啊,多狠心的人才会去卡龙龙宝宝啊。

但是好在不用写高精度,因为既然所有讨论都是在模 \(N\) 的意义下进行的,大可直接在计算过程中直接对 \(N\) 取模,这样就可以避免精度问题。而且比较良心的是由于 \(N\) 的范围不大,甚至可以不用扩欧而是直接枚举 \(x\) 的值来得到答案,就离谱。还有就是单个数字也可能很大,也就是说 sscanf 是行不通的,调了好久,边调边骂人,cao。

#include<bits/stdc++.h>
//#define feyn
#define int long long
const int N=200010;
using namespace std;
inline void read(int &wh){
    wh=0;int f=1;char w=getchar();
    while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
    while(w<='9'&&w>='0'){wh=wh*10+w-'0';w=getchar();}
    wh*=f;return;
}

int m,n,top;
char w[N];

struct node{int a,b;};
inline node operator +(node s1,node s2){
	return (node){(s1.a+s2.a)%n,(s1.b+s2.b)%n};
}
inline node operator -(node s1,node s2){
	return (node){(s1.a-s2.a)%n,(s1.b-s2.b)%n};
}
inline node operator *(node s1,node s2){
	return (node){(s1.a*s2.b%n+s1.b*s2.a%n)%n,(s1.b*s2.b)%n};
}

node aaa[N];
int bbb[N],topa,topb;
inline void pusha(node ss){
	aaa[++topa]=ss;
}
inline void pushb(int ss){
	bbb[++topb]=ss;
}

inline bool check(int s1,int s2){//s1<=s2?
	if(s2>=s1)return true;
	if(s2==2&&s1==3)return true;
	return false;
}
inline void work(int wh){
	while(topb>0&&check(wh,bbb[topb])){
		int op=bbb[topb];topb--;
		node s1=aaa[topa];topa--;
		node s2=aaa[topa];topa--;
		if(op==2)pusha(s1+s2);
		if(op==3)pusha(s2-s1);
		if(op==4)pusha(s1*s2);
	}
	pushb(wh);return;
}
/*
int gcd;
inline node exgcd(int aa,int bb){
	if(bb==0){gcd=aa;return (node){1,0};}
	node an=exgcd(bb,aa%bb);
	return (node){an.b,an.a-aa/bb*an.b};
}
*/
signed main(){
	
	#ifdef feyn
	freopen("in.txt","r",stdin);
	#endif
	
	scanf("%s",w+1);int len=strlen(w+1);read(m);read(n);
	for(int i=1;i<=len;i++){
		if(w[i]=='x'){pusha((node){1,0});continue;}
		if(w[i]=='('){pushb(1);continue;}
		if(w[i]=='+'){work(2);continue;}
		if(w[i]=='-'){work(3);continue;}
		if(w[i]=='*'){work(4);continue;}
		if(w[i]==')'){
			while(true){
				int op=bbb[topb];topb--;
				if(op==1)break;
				node s1=aaa[topa];topa--;
				node s2=aaa[topa];topa--;
				if(op==2)pusha(s1+s2);
				if(op==3)pusha(s2-s1);
				if(op==4)pusha(s1*s2);
			}
			continue;
		}
		int data=0;
		while(w[i]>='0'&&w[i]<='9'){
			data=data*10+w[i]-'0';
			data%=n;i++;
		}
		pusha((node){0,data});i--;
	}
	while(topb>0){
		int op=bbb[topb];topb--;
		node s1=aaa[topa];topa--;
		node s2=aaa[topa];topa--;
		if(op==2)pusha(s1+s2);
		if(op==3)pusha(s2-s1);
		if(op==4)pusha(s1*s2);
	}
	int aa=aaa[topa].a%n,bb=aaa[topa].b%n;
	for(int i=0;i<n;i++){
		if(((aa*i+bb)%n+n)%n==m%n){
			printf("%lld\n",i);return 0;
		}
	}
	
	return 0;
}
posted @ 2022-07-20 20:00  Feyn618  阅读(251)  评论(0编辑  收藏  举报