数论
3038 数列求和
题意:见题目链接
思路:性质题.一眼快速幂,然后被卡在了怎么枚举n上….
观察题目,我们发现模数是 m o d = 1 e 4 + 7 mod=1e4+7 mod=1e4+7,利用同余性质,我们可以发现 1 k = 1000 8 k 1^k=10008^k 1k=10008k, 2 k = 1000 9 k 2^k=10009^k 2k=10009k等,所以在统计求和答案时我们最多只需要枚举到mod即可,对于同余的数,我们将其周期统计一遍,统计答案时乘上即可
Code:
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a; i<=n; i++)
#define ios ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define int long long
#define pb push_back
#define fi first
#define sc second
#define pii pair<int,int>
using namespace std;
const int mod=1e4+7;
int ksm(int a,int b){
int ans=1;
a%=mod;
while(b){
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
void solve(){
int n, k;
cin>>n>>k;
int cy=n/mod, md=n%mod;
int ans=0;
for(int i=1; i<=mod; i++) ans=(ans+cy*ksm(i,k))%mod;
for(int i=1; i<=md; i++) ans=(ans+ksm(i,k))%mod;
cout<<ans<<'\n';
}
signed main(){
ios;
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}