这道题对我来说有陷阱虽说是赤果果的扩展欧几里德,看样子基本攻还是不够哈,基本功夫一定要好,准备每天上那种洗脑课时分 多看看数论书,弥补一下 自己 狗一样的基础,
这道题用到了一个性质:
#include<iostream> #include<cstdio> #include<list> #include<algorithm> #include<cstring> #include<string> #include<queue> #include<stack> #include<map> #include<vector> #include<cmath> #include<memory.h> #include<set> #define ll long long #define LL __int64 #define eps 1e-8 const ll INF=9999999999999; #define M 400000100 #define inf 0xfffffff using namespace std; //vector<pair<int,int> > G; //typedef pair<int,int> P; //vector<pair<int,int>> ::iterator iter; // //map<ll,int>mp; //map<ll,int>::iterator p; // //vector<int>G[30012]; LL extgcd(LL a,LL &x,LL b,LL &y) { if(b==0) { x=1; y=0; return a; } LL r=extgcd(b,x,a%b,y); LL t=x; x=y; y=t-a/b*y; return r; } int main(void) { LL a,b; while(cin>>a>>b) { LL x0,y0; LL x,y; LL gcd=extgcd(a,x0,b,y0); if(1%gcd!=0) { puts("sorry"); continue; } x=x0*1/gcd; y=y0*1/gcd; if(x<0) { x=x+b/gcd;//就是这里喔,虽然gcd肯定为1,但是为了让自己能尽快的熟练扩展欧几里德,还是坚持写全了 y=y-a/gcd;//其实原式子是 x=x+b/gcd*t(t为一个整数,因为运用了循环所以t不用管了) } cout<<x<<" "<<y<<endl; } }