输入
第一行输入n,表示接下来要输入n组;
接下来n行,分别三个,a, b, s, 分别表示要操作的两个数,和操作符号,比如1 2 +,表示1+2,2 1000000000 ^,表示2的1000000000次方;
因为结果可能很大,所以都要与1000000007取模再输出;
输出
输出计算结果,用换行隔开;
C++代码
#include<iostream>
#define ll long long
using namespace std;
ll p = 1000000007;
ll quickpow(ll a, ll b) {
ll ans = 1;
while (b) {
if (b & 1) ans = ans * a % p;
a = a * a % p, b = b >> 1;
}return ans % p;
}
int main() {
int i;
cin >> i;
while (i) {
ll a, b;
char s;
cin >> a >> b >> s;
if (s == '+') cout << (a % p + b % p) % p << endl;
if (s == '-') cout << (a % p - b % p) % p << endl;
if (s == '*') cout << ((a % p) * (b % p)) % p << endl;
if (s == '^') cout << quickpow(a, b) << endl;
i--;
}return 0;
}
这里重要的是求幂运算,如果是按照常规方法,求幂就是不停的乘自身,复杂度是O(n),通过快速幂,复杂度降为对数级。
在这里关键的是指数b的移位操作,b=b>>1,就是将二进制的b向右边移动一位,举个例子,2的11次方,11的二进制是1011,那2的11次方,就是2的二进制的1011次方,就是2的(8+2+1)次方,其中8,2,1就是二进制的位置的数,根据幂指数运算法则,2^(11)=2^(8+2+1)=2^8*2^2*2^1,相乘的数之间具有规律,都是前一个数位的平方,只要该数在该二进制位是1,这里就要乘以对应的数,每乘一次,二进制b就右移动一位,当b右移到为0,就退出,乘积结束,这就是快速幂的数学原理。