标签:不可 mat element row 题解 输入 一点 长度 lan
Input
Output
Sample Input
1 2 3 4 5
Sample Output
4
题解:
要求(a)
x+am≡y+an (mod L)
即: a(m?n)≡y?x (mod L)
即: a(m?n)+Lk=y?x
用拓展欧几里得求
a(m?n)+Lk=gcd(m?n,L)
令 d=gcd(m-n,L), c=y-x;
若c%d!=0 则无解。
解出a后,最终答案为:(a?c/d)mod(L/d)
证明:设要解的方程(求x)是:
而我们已经解得
所以:
这样并没有完,因为这只是一组解,我们要求最小正整数解。
我们知道:若一组 < x,y > 是ax+by=c的一组解,那么
也是原方程的一组解。
这样我们只需要让解得的x不断减b/d
,直到再减就为负数时,所得的x就是我们要的解。
其实这个过程就是模运算,所以最小正整数解就是:
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 using namespace std;
5 typedef long long ll;
6 ll x,y,m,n,l;
7 ll ex_gcd(ll a,ll b,ll &x,ll &y)//可以求出a,b和x,y的任意一组值
8 {
9 if(b==0)
10 {
11 x=1;
12 y=0;
13 return a;
14 }
15 ll q=ex_gcd(b,a%b,y,x);
16 y-=a/b*x;
17 return q;
18 }
19 int main()
20 {
21 while(~scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l))
22 {
23 if(m==n)
24 {
25 printf("Impossible\n");
26 continue;
27 }
28 if(m<n)
29 {
30 ll t=m;
31 m=n;
32 n=t;
33 ll q=y;
34 y=x;
35 x=q;
36 }
37 ll c=y-x;
38 ll a,k;
39 ll d=ex_gcd(m-n,l,a,k);
40 if(c%d)
41 printf("Impossible\n");
42 else
43 printf("%lld\n",((a*c/d)%(l/d)+(l/d))%(l/d));
44 }
45 }
标签:不可 mat element row 题解 输入 一点 长度 lan
原文地址:https://www.cnblogs.com/1013star/p/9386688.html