http://acdream.info/problem?pid=1007

两个 long long 相乘会超long long

Acdream a + b_#includeAcdream a + b_#include_02
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define ll long long
 5 #define maxn 10000
 6 #define mod 10000000007
 7 using namespace std;
 8 
 9 ll a[maxn];
10 ll n,k,t;
11 ll fMul(ll a, ll b) {
12     ll t = 0, y = a;
13     while(b) {
14         if(b & 1) t = (t + y) % mod;
15         y = (y + y) % mod;
16         b >>= 1;
17     }
18     return t;
19 }
20 
21 ll modExp(ll a, ll b) {
22     ll t = 1, y = a;
23     while(b) {
24         if(b & 1) t = (fMul(t, y)) % mod;
25         y = (fMul(y, y)) % mod;
26         b >>= 1;
27     }
28     return t;
29 }
30 
31 int main()
32 {
33       scanf("%lld",&t);
34       while(t--)
35       {
36           scanf("%lld%lld",&n,&k);
37           ll sum=0;
38           for(int i=0; i<n; i++)
39           {
40               scanf("%lld",&a[i]);
41           }
42           for(int i=0; i<n; i++)
43           {
44               a[i]=((a[i]%mod)+mod)%mod;
45               ll c=modExp(a[i],k);
46               sum=(sum+c)%mod;
47           }
48           printf("%lld\n",sum);
49       }
50       return 0;
51 }
View Code