1007 a + b
1 /*这题就是一个快速幂,但是十分猥琐的是,模是1e10 + 7,不是1e9 + 7,这就产生了一个爆long long的问题。所以要对快速幂中的乘法操作进行一下改造。请教了BIT_Is_a_Tree,学会了传说中的 「快速加」。原理和快速幂一模一样,a^{b}是b个a相乘,a \times b就是b个a相加。缺点是多了\log{n} 的复杂度。 2 */ 3 using namespace std; 4 typedef long long ll; 5 #define MOD 10000000007LL 6 ll fMul(ll a, ll b) { 7 ll t = 0, y = a; 8 while(b) { 9 if(b & 1) t = (t + y) % MOD; 10 y = (y + y) % MOD; 11 b >>= 1; 12 } 13 return t; 14 } 15 ll modExp(ll a, ll b) { 16 ll t = 1, y = a; 17 while(b) { 18 if(b & 1) t = (fMul(t, y)) % MOD; 19 y = (fMul(y, y)) % MOD; 20 b >>= 1; 21 } 22 return t; 23 } 24 int main() { 25 int T; 26 ll n, k, t, sum; 27 cin >> T; 28 while(T--) { 29 cin >> n >> k; 30 sum = 0; 31 for(int i = 1; i <= n; i++) { 32 cin >> t; 33 t = ((t % MOD) + MOD) % MOD; 34 sum += modExp(t, k); 35 sum %= MOD; 36 } 37 cout << sum << endl; 38 } 39 return 0; 40 }