SLON
很简单的模拟题但数据比较毒瘤,于是考场上成功爆零。
就直接用栈来维护中缀表达式的计算,然后求出一次项系数和常数项之后上扩展欧几里得就可以了。但是它……
数据太大,用龙龙宝宝一分都拿不到。龙龙宝宝多可爱的啊,多狠心的人才会去卡龙龙宝宝啊。
但是好在不用写高精度,因为既然所有讨论都是在模 \(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;
}
一如既往,万事胜意