原题传送门:求和 - 洛谷
指数很大我们可以用快速幂来解决,再逆天的数都可以在64次内解决(即O(1))。
所以b很大不是问题(逃),问题是a这么大如何解决,这样一个循环肯定是要爆的。
快速幂传送门:【模板】快速幂||取余运算 - 洛谷
取模的值通常是有规律的,而且这道题给的模范围非常小,也就是说可以通过找规律来解决
原式:a^b % p
即:b个a相乘再模上p,下面用2个a来代替b个a
转换:(a*a) % p 通过乘法取模分配律得到下面的式子
(a%p * a%p)%p (也就是b个a%p相乘再模p)
(a%p)^b % p
也就是a的范围被p限制住了,若p=100,那么a=101 相当于 a=1
所以这道题写一个前缀和就做出来了(喜)
AC代码
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int MOD=1e4;
ll pre[10010];
ll quick_pow(ll a,ll b){
ll base=a;
ll ans=1;
while(b){
if(b&1)ans*=base;
b>>=1;
base*=base;
ans%=MOD;
base%=MOD;
}
return ans;
}
int main(){
cin.tie(nullptr),cout.tie(nullptr);
ios::sync_with_stdio(false);
ll a,b,n,ans;
cin>>n;
while(n--){
cin>>a>>b;
for(int i=1;i<=10000;i++){
pre[i]= (pre[i-1]+quick_pow(i,b))%MOD;
}
ans=(a/MOD*pre[MOD]+pre[a%MOD])%MOD;
//因为都是取模的答案,故a/MOD 为有多少个pre[MOD]
//以及a%MOD剩下的余数部分
cout<<ans<<endl;
}
return 0;
}