acdream 1007 a+b 快速幂取模

来源:互联网 发布:加盟淘宝店可靠吗 编辑:程序博客网 时间:2024/06/05 17:37

给出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;}
0 0