同余方程
题目描述
求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解。
输入
输入只有一行,包含两个正整数 a, b,用一个空格隔开。
输出
输出只有一行,包含一个正整数 x0,即最小正整数解。输入数据保证一定有解。
样例输入
3 10
样例输出
7
提示
对于 100%的数据,2 ≤a, b≤ 2,000,000,000。
题目即为逆元的定义
费马小定理不适用
逆元 http://www.cnblogs.com/linyujun/p/5194184.html
#include <iostream> #include <bits/stdc++.h> #define LL long long using namespace std; long long a,mod; //long long quickpow(long long a,long long b) //{ // if(b<0) return 0; // long long ret=1; // a%=mod; // while(b) // { // if(b&1) ret =(ret*a)%mod; // b>>=1; // a = (a*a)%mod; // } // return ret; //} // //long long inv(long long a) //{ // return quickpow(a,mod-2); //}//费马小定理适用条件:mod为质数 LL exgccd(LL a,LL b,LL &x,LL &y) { if(b==0) { x=1; y=0; return a; } LL g,t; g = exgccd(b,a%b,x,y); t = x; x = y; y = t-a/b*y; } LL inv(LL b,LL p) { LL x,y; exgccd(b,p,x,y); return x = (x%p+p)%p; } int main() { cin>>a>>mod; cout<<inv(a,mod)<<endl; return 0; }