大數取模的二進位制方法
阿新 • • 發佈:2018-11-19
我們先把b轉化為2進位制 b=(a[t] a[t-1] a[t-2]....a[1] a[0]) (a[i]為0或1)
那麼b = a[t]*2^t + a[t-1]*2^(t-1) + ... ... + a[1]*2^1 + a[0]*2^0(其中 a[i]=0,1)
a^b mod c =a^(a[t]*2^t + a[t-1]*2^(t-1) + ... ... + a[1]*2^1 + a[0]*2^0) mod c;
= ((a^(a[0]*2^0) mod c) * a^(a[1]*2^1) mod c) ... ...
注意: a^(2^(i+1))mod c = (a^ (2^i) mod c)^2 mod c
#include<iostream> using namespace std; typedef long long int ll;; ll mod_exp(ll a, ll b_0, ll n) { if (a > n) a %= n; ll i, d = 1, b[70]; for (i = 0; i < 70; i++) { b[i] = b_0 % 2; b_0 /= 2; if(b_0 == 0) { break; } } for (; i >= 0; i--) { d = (d * d) % n; if (b[i] == 1) d = (d * a) % n; } return d; } int main() { std::ios::sync_with_stdio(false); ll m,n; ll b; while(std::cin>>m>>b>>n) cout<<mod_exp(m,b,n); }