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 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-01-01
  • 2021-12-19
  • 2021-09-01
  • 2021-11-06
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-12-22
  • 2022-02-05
  • 2021-11-25
  • 2021-09-11
  • 2021-12-26
  • 2021-08-22
  • 2022-12-23
相关资源
相似解决方案