同余模和快速幂

同余模

(a+b)%n = ((a%n) +  (b%n)) % n

(a-b)%n = ((a%n) -  (b%n) + n) % n

(a*b)%n = (a%n)(b%n) % n


快速幂

原理:

3 ^ 999

 = 3 ^ (512 + 256 + 128 + 64 + 32 + 4 + 2 + 1) 

= (3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3

#include <iostream>

using namespace std;

void km(){//快速幂
    int a,n;
    cin >> a >> n;
    int pow = 1;
    while (n){
        if (n&1){
            pow *= a;
        }
        a *= a;
        n >>= 1;
    }
    cout << pow << endl;
    return;
}

void kmm(){//快速幂模
    int a,n,c;
    cin >> a >> n >> c;
    int pow = 1;
    while (n){
        if (n&1){        //等价于 (n%2)==1
            pow =(pow*a)%c;
        }
        a =(a*a)%c;       
        n >>= 2;        //等价于 n/=2
    }
    cout << pow << endl;
    return 0;
}


int main() {
    km();
   // kmm();
    return 0;
}

输入正整数a、n、m,输出a^n%m的值。a,n,m<=10^9。

int pow_mod(int a, int n, int m)
{
   int ans = 1;
    for(int i=0; i<n; i++)
    {
    ans = (int)((long long)ans * n % m);
    }
}

分治改进:

int pow_mod(int a, int n, int m)
{
    if(n == 0) return 1;
    int x = pow_mod(a, n/2, m);
    long long ans = (long long)x * x % m;
    if(n%2 == 1) ans = ans * a % m;
    return (int)ans;
}


猜你喜欢

转载自blog.csdn.net/a_thinking_reed_/article/details/79691892