大神orz(具体参考请点这)
我根据个人感觉弄了一下自己的思路
ZOJ 3609 :http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4712 求最小逆元,坑点就是对m=1的特判
/************************************************************** Problem:zoj 3609 User: youmi Language: C++ Result: Accepted Time:0s Memory:272kb ****************************************************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") //#include<bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <stack> #include <set> #include <sstream> #include <cmath> #include <queue> #include <deque> #include <string> #include <vector> #define zeros(a) memset(a,0,sizeof(a)) #define ones(a) memset(a,-1,sizeof(a)) #define sc(a) scanf("%d",&a) #define sc2(a,b) scanf("%d%d",&a,&b) #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c) #define scs(a) scanf("%s",a) #define sclld(a) scanf("%I64d",&a) #define pt(a) printf("%d\n",a) #define ptlld(a) printf("%I64d\n",a) #define rep0(i,n) for(int i=0;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) #define rep_1(i,n) for(int i=n;i>=1;i--) #define rep_0(i,n) for(int i=n-1;i>=0;i--) #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define lson (step<<1) #define rson (lson+1) #define esp 1e-6 #define oo 0x3fffffff #define TEST cout<<"*************************"<<endl using namespace std; typedef long long ll; ll exgcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1,y=0; return a; } ll ans=exgcd(b,a%b,x,y); ll temp=x; x=y; y=temp-a/b*y; return ans; } int main() { freopen("in.txt","r",stdin); int T_T; scanf("%d",&T_T); for(int kase=1;kase<=T_T;kase++) { ll a,mod; scanf("%lld%lld",&a,&mod); ll x,y; ll ans=exgcd(a,mod,x,y); if(1%ans) printf("Not Exist\n"); else printf("%lld\n",(x%mod+mod)%mod+(mod==1)); } return 0; }
ZOJ 3593 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3593 求最小的步数,等价于求解方程:
ax+by=gcd,(A-B)%gcd==0。
又因为要求最小步数,所以,
根据x = x0 + (b/gcd)*t,y = y0 – (a/gcd)*t
我们可以推断当x==y时,步数是最小的,
即y0-x0=t*(a+b)/gcd→t=(y0-x0) / ((a+b)/gcd),
这样t的范围也就确定了。最后,如果x,y同号,取最大;如果异号,则做差
/************************************************************** Problem:zoj 3593 User: youmi Language: C++ Result: Accepted Time:0ms Memory:272kb ****************************************************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") //#include<bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <stack> #include <set> #include <sstream> #include <cmath> #include <queue> #include <deque> #include <string> #include <vector> #define zeros(a) memset(a,0,sizeof(a)) #define ones(a) memset(a,-1,sizeof(a)) #define sc(a) scanf("%d",&a) #define sc2(a,b) scanf("%d%d",&a,&b) #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c) #define scs(a) scanf("%s",a) #define sclld(a) scanf("%I64d",&a) #define pt(a) printf("%d\n",a) #define ptlld(a) printf("%I64d\n",a) #define rep0(i,n) for(int i=0;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) #define rep_1(i,n) for(int i=n;i>=1;i--) #define rep_0(i,n) for(int i=n-1;i>=0;i--) #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define lson (step<<1) #define rson (lson+1) #define esp 1e-6 #define oo (1ll<<31) #define TEST cout<<"*************************"<<endl using namespace std; typedef long long ll; ll ex_gcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1,y=0; return a; } ll gcd=ex_gcd(b,a%b,x,y); ll temp=x; x=y; y=temp-a/b*y; return gcd; } int main() { //freopen("in.txt","r",stdin); int T_T; scanf("%d",&T_T); for(int kase=1;kase<=T_T;kase++) { ll A,B,a,b; scanf("%lld%lld%lld%lld",&A,&B,&a,&b); ll x,y; ll len=B-A; ll gcd=ex_gcd(a,b,x,y); if(len%gcd==0) { a=a/gcd,b=b/gcd; x*=len/gcd,y*=len/gcd; ll m=(y-x)/(a+b); ll ans=1ll*oo*oo,temp; for(ll t=m-1;t<=m+1;t++) { if(abs(x+b*t)+abs(y-a*t)==abs(x+b*t+y-a*t)) temp=Max(abs(x+b*t),abs(y-a*t)); else temp=abs(x-y+(a+b)*t); ans=Min(temp,ans); } printf("%lld\n",ans); } else printf("-1\n"); } return 0; }
POJ 1061 http://poj.org/problem?id=1061 青蛙的约会,由题意得:(mk+x)%L==(nk+y)%L,所以
(m-n)k+L*t=gcd,(x-y)%gcd==0.。。。。。。。
/************************************************************** Problem:poj 1061 User: youmi Language: C++ Result: Accepted Time:0ms Memory:140kb ****************************************************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") //#include<bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <stack> #include <set> #include <sstream> #include <cmath> #include <queue> #include <deque> #include <string> #include <vector> #define zeros(a) memset(a,0,sizeof(a)) #define ones(a) memset(a,-1,sizeof(a)) #define sc(a) scanf("%d",&a) #define sc2(a,b) scanf("%d%d",&a,&b) #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c) #define scs(a) scanf("%s",a) #define sclld(a) scanf("%I64d",&a) #define pt(a) printf("%d\n",a) #define ptlld(a) printf("%I64d\n",a) #define rep0(i,n) for(int i=0;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) #define rep_1(i,n) for(int i=n;i>=1;i--) #define rep_0(i,n) for(int i=n-1;i>=0;i--) #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define lson (step<<1) #define rson (lson+1) #define esp 1e-6 #define oo 0x3fffffff #define TEST cout<<"*************************"<<endl using namespace std; typedef long long ll; ll ex_gcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1,y=0; return a; } ll gcd=ex_gcd(b,a%b,x,y); ll temp=x; x=y; y=temp-a/b*y; return gcd; } int main() { //freopen("in.txt","r",stdin); ll A,B,a,b,l; while(~scanf("%lld%lld%lld%lld%lld",&A,&B,&a,&b,&l)) { ll x,y; ll gcd=ex_gcd(a-b,l,x,y); ll len=B-A; if(len%gcd==0) { x*=len/gcd; l=abs(1.0*l/gcd); x%=l; if(x<=0) x+=l; printf("%lld\n",x); } else printf("Impossible\n"); } return 0; }
HDU 1576 http://acm.hdu.edu.cn/showproblem.php?pid=1576 由题意可得:A=Bx,A=n+9973y;所以回归到我们的经典方程可得:
Bx+9973y=gcd,n%gcd==0。。
/************************************************************** Problem:hdu 1576 User: youmi Language: C++ Result: Accepted Time:0ms Memory:1548kb ****************************************************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") //#include<bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <stack> #include <set> #include <sstream> #include <cmath> #include <queue> #include <deque> #include <string> #include <vector> #define zeros(a) memset(a,0,sizeof(a)) #define ones(a) memset(a,-1,sizeof(a)) #define sc(a) scanf("%d",&a) #define sc2(a,b) scanf("%d%d",&a,&b) #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c) #define scs(a) scanf("%s",a) #define sclld(a) scanf("%I64d",&a) #define pt(a) printf("%d\n",a) #define ptlld(a) printf("%I64d\n",a) #define rep0(i,n) for(int i=0;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) #define rep_1(i,n) for(int i=n;i>=1;i--) #define rep_0(i,n) for(int i=n-1;i>=0;i--) #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define lson (step<<1) #define rson (lson+1) #define esp 1e-6 #define oo 0x3fffffff #define TEST cout<<"*************************"<<endl using namespace std; typedef long long ll; ll ex_gcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1,y=0; return a; } ll gcd=ex_gcd(b,a%b,x,y); ll temp=x; x=y; y=temp-a/b*y; return gcd; } void cal(ll a,ll b,ll c) { ll x,y; ll gcd=ex_gcd(a,b,x,y); x*=c/gcd; b=abs(1.0*b/gcd); x%=b; if(x<=0) x+=b; ptlld(x); } int main() { //freopen("in.txt","r",stdin); int T_T; scanf("%d",&T_T); for(int kase=1;kase<=T_T;kase++) { ll n,b; scanf("%I64d%I64d",&n,&b); cal(b,9973,n); } return 0; }
HDU 2669 http://acm.hdu.edu.cn/showproblem.php?pid=2669 这个是裸的欧几里得不为过,不过好好利用ax+by=1会使思路更加明晰
/************************************************************** Problem: User: youmi Language: C++ Result: Accepted Time: Memory: ****************************************************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") //#include<bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <stack> #include <set> #include <sstream> #include <cmath> #include <queue> #include <deque> #include <string> #include <vector> #define zeros(a) memset(a,0,sizeof(a)) #define ones(a) memset(a,-1,sizeof(a)) #define sc(a) scanf("%d",&a) #define sc2(a,b) scanf("%d%d",&a,&b) #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c) #define scs(a) scanf("%s",a) #define sclld(a) scanf("%I64d",&a) #define pt(a) printf("%d\n",a) #define ptlld(a) printf("%I64d\n",a) #define rep0(i,n) for(int i=0;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) #define rep_1(i,n) for(int i=n;i>=1;i--) #define rep_0(i,n) for(int i=n-1;i>=0;i--) #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define lson (step<<1) #define rson (lson+1) #define esp 1e-6 #define oo 0x3fffffff #define TEST cout<<"*************************"<<endl using namespace std; typedef long long ll; ll ex_gcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1,y=0; return a; } ll gcd=ex_gcd(b,a%b,x,y); ll temp=x; x=y; y=temp-a/b*y; return gcd; } ll cal(ll a,ll b,ll c) { ll x,y; ll gcd=ex_gcd(a,b,x,y); if(c%gcd) return -1; x*=c/gcd; b=abs(1.0*b/gcd); x%=b; if(x<=0) x+=b; return x; } int main() { //freopen("in.txt","r",stdin); ll a,b; while(~scanf("%I64d%I64d",&a,&b)) { ll ans=cal(a,b,1); if(ans==-1) printf("sorry\n"); else printf("%I64d %I64d\n",ans,(1-ans*a)/b); } return 0; }
poj 2115 http://poj.org/problem?id=2115 A+XC==B(MOD 2^K)
/************************************************************** Problem: User: youmi Language: C++ Result: Accepted Time:0MS Memory:712K ****************************************************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") //#include<bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <stack> #include <set> #include <sstream> #include <cmath> #include <queue> #include <deque> #include <string> #include <vector> #define zeros(a) memset(a,0,sizeof(a)) #define ones(a) memset(a,-1,sizeof(a)) #define sc(a) scanf("%d",&a) #define sc2(a,b) scanf("%d%d",&a,&b) #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c) #define scs(a) scanf("%s",a) #define sclld(a) scanf("%I64d",&a) #define pt(a) printf("%d\n",a) #define ptlld(a) printf("%I64d\n",a) #define rep0(i,n) for(int i=0;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) #define rep_1(i,n) for(int i=n;i>=1;i--) #define rep_0(i,n) for(int i=n-1;i>=0;i--) #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define lson (step<<1) #define rson (lson+1) #define esp 1e-6 #define oo 0x3fffffff #define TEST cout<<"*************************"<<endl using namespace std; typedef long long ll; ll ex_gcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1,y=0; return a; } ll ans=ex_gcd(b,a%b,x,y); ll temp=x; x=y; y=temp-y*(a/b); return ans; } void solve(ll a,ll b,ll c) { ll x,y; ll d=ex_gcd(a,b,x,y); if(c%d!=0) { printf("FOREVER\n"); return ; } ll t=b/d; x=(x*(c/d)%t+t)%t; printf("%lld\n",x); } int main() { //freopen("in.txt","r",stdin); ll a,b,c,k; while(~scanf("%lld%lld%lld%lld",&a,&b,&c,&k)&&(a+b+c+k)) { solve(c,1ll<<k,b-a); } return 0; }