wenbao与费马及快速幂
费马小定理:
a^(b-1)%b == 1; (a, b互素)
费马大定理:
a^(@b)%b == 1;(@b为欧拉函数)
快速幂:
根据幂次方的性质进行处理log2(b)次
随便说一下为什么很多题目取模的时候会用到 1e9+7 ? 因为它是素数(它的孪生素数 1e9+9 )任何数对大素数取模得到的答案能有效的减少冲突(如果取模的数不是素数那么会有许多同余的情况)
1 //求a^b; 2 3 const int MOD = 1e9+7; 4 ll sum = 1; 5 while(b){ 6 if(b & 1) sum = sum*a%MOD; 7 sum >>= 1; 8 a = a*a%MOD; 9 }
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 #define ll long long 6 const ll MOD = 1e9+7; 7 ll a, c; 8 char str[100005]; 9 int main(){ 10 while(~scanf("%lld%s%lld", &a, str, &c)){ 11 a %= MOD, c %= MOD; 12 ll sum = 0; 13 int len = strlen(str); 14 for(int i = 0; i < len; i++){ 15 sum = (sum*10 + str[i] - '0') % (MOD - 1LL); 16 } 17 while(sum){ 18 if(sum & 1) c = c * a % MOD; 19 sum >>= 1; 20 a = a * a % MOD; 21 } 22 printf("%lld\n", c % MOD); 23 } 24 return 0; 25 }
只有不断学习才能进步!