#include<iostream>
#include<algorithm>
// (a + b) % p = (a % p + b % p) % p (1)
//
// (a - b) % p = (a % p - b % p ) % p (2)
//
// (a * b) % p = (a % p * b % p) % p (3)
// (a*b*c)%d=(a%d*b%d*c%d)%d;
// 乘积对某个数取模等与取模乘积在取模
using namespace std;
//例如,3 5 8,3^5 Mod 8 = 3。
long long quickpower(long long a,long long b,long long c){
int result = 1;
for(int i = 1;i <= b;i++){
result *= a;
result %= c;
}
return result;
}
long long quickpower2(long long base,long long power,long long mod){
long long result = 1;
while(power > 0){
if(power % 2 == 0){
power /= 2;
base = base * base % mod;
}
else{
power -= 1;
result = result * base % mod;
power /= 2;
base = base * base % mod;
}
}
return result;
}
// 与方法二一样,不同的表达
long long quickpower3(long long a,long long b,long long mod){
long long ans = 1;
long long base = a;
while(b){
if(b & 1){ // 即只要是奇数
ans = base * ans % mod;
cout << ans << " ";
}
base = base * base % mod;
//代表向右移一位 比如 111 -> 011 ,就相当于除以2,最右边的数会被抛弃即 7 / 2 = 3
// 101 -> 10 自动
b >>= 1;
}
return ans;
}
// 转圈游戏
// (x + m * 10 ^ k ) % n。
long long cycle(int n,int m,int k,int x){
long long result = 0;
result += x % n;
long long result1 = m % n;
result1 *= quickpower2(10,k,n);
return result + result1;
}
int main(){
int n = 10,m = 2,k = 4,x = 5;
cout << quickpower2(2,10,1000) << endl;
cout << cycle(10,3,4,5) << endl;
cout << (x + m * quickpower2(10,k,n) ) % n << endl;
}
04-26
595
03-25
1852
09-26
414