Acdeam 1007 快速幂+大数乘法

来源:互联网 发布:音乐可视化效果软件 编辑:程序博客网 时间:2024/06/05 16:46

题意很简单,难点在于对10000000007取余,longlong相乘会爆longlong,所以这里将整数分解,b=(p*(b/p)+b%p),然后再相乘的时候一步一步的乘即可。

另外注意,题目最大的坑点在于取模运算,负数取模要取正数,而%一般取得是负数,这时需要处理下。

附代码:

#include <iostream>#include <cstring>#include <cstdio>using namespace std;long long int a[1010];long long int k;long long int s;long long int mod=10000000007;long long int p=100000;long long int mul(long long int a,long long int b){    long long int sum=0;    sum=(a*p)%mod;    long long int c=b/p;    sum=(sum*c)%mod;    b=b%p;    sum=(sum+(a*b)%mod)%mod;    return sum%mod;}long long int sap(long long int a,long long int k){    long long int sum=1;    while (k>0)    {        a=a%mod;        if (k%2==1)            sum=mul(sum,a);        a=mul(a,a);        k=k/2;    }    return sum%mod;}int main(){    int T;    cin>>T;    while (T--)    {        int n;        s=0;        cin>>n>>k;        for (int i=1;i<=n;i++)            cin>>a[i];        for (int i=1;i<=n;i++)            s=(s+sap(a[i]%mod,k))%mod;        while (s<0)            s=s+mod;        cout<<s<<endl;    }}


 

0 0
原创粉丝点击