给出k和n个ai,计算∑ai^k mod 10000000007的值。
#include <iostream>
#include <cstdio>
#define MOD 10000000007
#define ll long long
//模乘法,本质就是用位运算和加法实现除法
//可以防止做乘法时越界
ll mul(ll a,ll b)
{
ll ans = 0;
while(b){
if(b&1) ans = (ans + a) % MOD;
b = b >> 1;
a = (a << 1) % MOD;
}
ans = ans % MOD;
return ans;
}
//快速幂取模
ll pow_mod(ll a,ll b)
{
if(b == 0) return 1;
ll x = pow_mod(a,b / 2);
ll ans = mul(x,x)% MOD;
if(b % 2 == 1) ans = mul(ans,a) % MOD;
return ans;
}
//
//ll pow_mod(ll a,ll b)
//{
// ll ans = 1;
// while(b){
// if(b&1) ans = mul(ans,a) % MOD;
// b = b >> 1;
// a = mul(a,a) % MOD;
// }
// return ans;
//}
int main()
{
int T;
std::cin>>T;
//scanf("%lld",&T);
int n;
ll m,k;
while(T--){
std::cin>>n>>k;
// scanf("%d%lld",&n,&k);
ll ans = 0;
if(k % 2 == 0){
while(n--){
// scanf("%lld",&m);
std::cin>>m;
if(m < 0) m = m * -1;
ans = (ans + pow_mod(m,k)) % MOD;
// if(m == 0 && k == 0){
// ans = (ans + 1) % MOD;
// }
}
}else{
while(n--){
//scanf("%lld",&m);
std::cin>>m;
if(m < 0) {
m = m * -1;
ans = (ans - pow_mod(m,k)) % MOD;
}else{
ans = (ans + pow_mod(m,k)) % MOD;
}
}
}
std::cout<<(ans + MOD) % MOD<<std::endl;
//printf("%lld\n",(ans + MOD) % MOD);
}
return 0;
}