高速電力計算(シンプルな計算機)

入る

最初の行にnと入力して、次にn個のグループを入力することを示します。

次のn行には、それぞれ3つのa、b、sがあり、それぞれ2つの演算される数値を表します。12 +などの演算記号は、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を1ビット右に移動します。たとえば、2は11乗、11はバイナリ1011、2は11です。べき乗は、2の2の1011乗と2の(8 + 2 + 1)のべき乗です。ここで、8、2、1は、バイナリ位置の数です。べき指数アルゴリズムによると、2 ^(11)= 2 ^(8 + 2 + 1)= 2 ^ 8 * 2 ^ 2 * 2 ^ 1、乗算された数値間にパターンがあり、数値が2進数で1である限り、それらはすべて前の桁の2乗です。対応する数値を乗算する必要があります。乗算するたびに、バイナリbは1ビット右に移動します。bが右に移動して0になると、終了して積が終了します。これは、高速なべき乗の数学的原理です。

 

おすすめ

転載: blog.csdn.net/sinat_39416814/article/details/108700773