标签:main col 转化 费马小定理 一条直线 name 直线 targe pre
原题链接:https://www.luogu.org/problem/show?pid=1082#sub
此题乃exgcd的模板题,当然也可以用费马小定理做(赤裸裸的逆元啊)
还记得exgcd是啥吗?扩展欧几里得算法,用来求解形似ax+by = gcd(a,b)一类方程的解。
那和这个题有什么关系啊?这个题要求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解,我们把这个式子展开看一下。
由同余式的意义,可以得知ax % b=1, 1%b =1,可以转化成方程ax+by=1,然后要求这个方程的一组解。
很显然,这个方程代表的是一条直线,满足这个方程的解对应的点都在这条直线上,即有无数个解,我们要找的是最小的正整数解x。
(y到底是多少没必要去关心,我们求的是x,这样等价正好满足扩欧)
同时,这个方程在gcd(a,b)!=1时无解,不过没关系啦,本题保证一定有解。
我们用扩欧求出的解并不一定是最小解,所以输出的时候要对b取模。
负数解怎么办?先加一个b,再对b取模,搞定。
参考代码:
1 #include <iostream> 2 using namespace std; 3 long long int a,b,x,y; 4 void exgcd(long long int a,long long int b,long long int &x,long long int &y){ 5 if (!b){ 6 x = 1; 7 y = 0; 8 } 9 else{ 10 exgcd(b,a%b,y,x); 11 y -= (a/b) * x; 12 } 13 } 14 int main(){ 15 cin >> a >> b; 16 exgcd(a,b,x,y); 17 cout << (x+b) % b << endl; 18 return 0; 19 }
标签:main col 转化 费马小定理 一条直线 name 直线 targe pre
原文地址:http://www.cnblogs.com/OIerShawnZhou/p/7496867.html