- int quick(int a,int b,int c)
时间复杂度为O(log(2)n);
可以将b转化为二进制
b为偶数时 a = a * a % c;
b为奇数时 ans = ans * a % c;
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int quick(int a,int b,int c)
- {
- int ans=1; //记录结果
- a=a%c; //预处理,使得a处于c的数据范围之下 2
- while(b!=0)//100
- {
- //if(b&1)
- if(b % 2 == 1) ans=(ans*a)%c;
- cout <<"b1 = " << b;
- //如果b的二进制位不是0,那么我们的结果是要参与运算的
- b /= 2; //b >>= 1;
- cout << "b = " << b;//二进制的移位操作,相当于每次除以2,用二进制看,就是我们不断的遍历b的二进制位
- a=(a*a)%c; //不断的加倍 0
- }
- return ans;
- }
- int main()
- {
- int a , b , c;
- cin >> a >> b >> c;
- cout << quick(a , b , c) << endl;
- return 0;
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- long long int a , b , c;
- int t;
- scanf("%d" , &t);
- while(t--)
- {
- cin >> a >> b >> c;
- long long int ans = 1;
- while(b>1)
- {
- cout << b << endl;
- if(b % 2 == 1)
- {
- ans *= ans * a % c;
- b--; // 一定要加上b--,否则为奇数时,会死循环
- }
- else
- {
- b /= 2;
- }
- a = a * a % c;
- }
- cout << ans << endl;
- }
- return 0;
- }
}