entrar
Ingrese n en la primera línea, indicando que luego ingresará n grupos;
En las siguientes n líneas, hay tres respectivamente, a, b, s, que representan respectivamente los dos números a operar, y el símbolo de operación, como 1 2 +, que significa 1 + 2, 2 1000000000 ^, que significa 2 elevado a la potencia de 1000000000;
Debido a que el resultado puede ser muy grande, debe ser módulo 1000000007 y luego emitir;
Salida
Resultados del cálculo de salida, separados por líneas nuevas;
Código 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;
}
Lo importante aquí es la operación de exponenciación. Si es de acuerdo con el método convencional, la exponenciación es multiplicarse continuamente. La complejidad es O (n). A través de la exponenciación rápida, la complejidad se reduce a nivel logarítmico.
La clave aquí es la operación de desplazamiento del exponente b, b = b >> 1, que es mover el binario b un bit hacia la derecha. Por ejemplo, 2 es la undécima potencia, 11 es el 1011 binario y 2 es 11 La potencia es la potencia 1011 del binario de 2 y la potencia (8 + 2 + 1) de 2, donde 8, 2, 1 es el número de la posición binaria. Según el algoritmo del exponente de potencia, 2 ^ (11) = 2 ^ (8 + 2 + 1) = 2 ^ 8 * 2 ^ 2 * 2 ^ 1, hay un patrón entre los números multiplicados, y todos son cuadrados del dígito anterior, siempre que el número sea 1 en el dígito binario, aquí Es necesario multiplicar el número correspondiente. Cada vez que se multiplica, el binario b se mueve un bit a la derecha. Cuando b se mueve a la derecha a 0, sale y el producto termina. Este es el principio matemático de exponenciación rápida.