NOIP2012同余方程
描述
求关于 x的同余方程 ax ≡ 1(mod b) 的最小正整数解。
输入格式
输入文件 mod.in
输入只有一行,包含两个正整数a,b,用一个空格隔开。
输入只有一行,包含两个正整数a,b,用一个空格隔开。
输出格式
输出文件 为 modmod .out 。
输出只有一行,包含一个正整数,包含一个正整数 ,包含一个正整数 x0,即最小正整数解。 输入据保证一定有解。
输出只有一行,包含一个正整数,包含一个正整数 ,包含一个正整数 x0,即最小正整数解。 输入据保证一定有解。
测试样例1
输入
3 10
输出
7
备注
对于 40% 的数据 2 ≤b≤1,000
对于 60% 的数据 2 ≤b≤50,000,000
对于 100%的数据 2 ≤a, b≤2,000,000,000NOIP2012-TG
对于 60% 的数据 2 ≤b≤50,000,000
对于 100%的数据 2 ≤a, b≤2,000,000,000NOIP2012-TG
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<cmath> #include<algorithm> #define ll long long using namespace std; ll euler_phi(ll x){ ll m = (ll)sqrt(x+0.5); ll ans = x; for(int i = 2;i <= m;i++){ if(x % i == 0){ ans = ans / i * (i-1); while(x % i == 0) x /= i; } } if(x > 1) ans = ans / x * (x-1); return ans; } ll q_mul(ll a,ll b,ll p){ ll ans = 0; while(b){ if(b&1){ ans = (ans + a) % p; b--; } b >>= 1; a = (a + a) % p; } return ans; } ll q_pow(ll a,ll b,ll p){ ll ans = 1; while(b){ if(b&1){ ans = q_mul(ans,a,p); } b >>= 1; a = q_mul(a,a,p); } return ans; } void exgcd(ll a,ll b,ll& d,ll& x,ll& y){ if(b == 0){ x = 1; y = 0; d = a; return; } exgcd(b,a%b,d,y,x); y -= (a/b)*x; } int phi[1000]; void phi_table(int n){ for(int i = 2;i <= n;i++) phi[i] = 0; phi[1] = 1; for(int i = 2;i <= n;i++) if(!phi[i]) for(int j = i;j <= n;j+=i){ if(!phi[j]) phi[j] = j; phi[j] = phi[j] / i * (i-1); } } int main(){ ll a,b,d,x,y; cin>>a>>b; cout<<q_pow(a,euler_phi(b)-1,b); return 0; }