vijos P1009 清帝之惑之康熙
阿新 • • 發佈:2019-02-01
用擴充套件歐幾里得演算法求解線性同餘方程就可以了,要注意求出來的應該是最小非負數。
等價於求方程k(m-n)與(y-x)關於l同餘,k為非負整數的解
方程:
k*(m-n)-ld=y-x
若y-x不是gcd(m-n,l)的倍數輸出impossible,否則用ext_gcd求出一個解,然後不斷使得k+=l/gcd(m-n,l)直到>0或者k-=l/gcd(m-n,l)直到<0即可。
#include <vector> #include <list> #include <limits.h> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #include <string.h> #include <stdlib.h> using namespace std; long long L; long long extended_euclidean(long long a, long long b, long long &x, long long &y){ if(b==0){ x = 1; y = 0; return a; } long long g = extended_euclidean(b, a%b, x, y); long long tmp = x; x = y; y = tmp - (a/b)*y; return g; } int main(){ long long x, y, m, n; cin>>x>>y>>m>>n>>L; long long a = (m-n+L)%L; long long b = L; long long c = (y-x+L)%L; long long g = extended_euclidean(a, b, x, y); if(c%g != 0){ cout<<"Impossible"<<endl; return 0; } long long k = c/g; x = (x*k); if(x < 0) x = (L/g-(abs(x)%(L/g))); if((x-L/g) > 0) x = x%(L/g); cout<<x<<endl; //system("pause"); return 0; }