洛谷P1630 求和
题目:https://www.luogu.org/problemnew/show/1630
题目描述
求1^b+2^b+……+a^b的和除以10000的余数。
输入输出格式
输入格式:
第一行包含一个正整数N,表示共有N组测试数据;
接下来N行,每行包含两个正整数a和b。
【数据规模】
对于30%的数据中,满足N<=10,a,b<=1000;
对于100%的数据中,满足N<=100,a,b<=1000000000;
输出格式:
共N行,每行一个对应的答案。
输入输出样例
输出样例#1:
View Code
9
解析
暴力分30分还用我解释吗( ﹁ ﹁ ) ~→
就算你用了快速幂,for循环一遍,还是30分( ﹁ ﹁ ) ~→
当你不会的时候,就看看范围啊。。
mod10000,只有一万(⊙ω⊙)
我们可以算出mod10000相同的数,分在一组,比如2333和23333和233333就分在一组,
然后,这一组有多少个数,我就把这个组的数快速幂求出b次方然后乘组中元素个数就行啦(详情看代码)。
只要不忘了%mod和开long long 和多组数据就没什么问题啦。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 #define ll long long 8 #define mod 10000 9 ll n,tmp; 10 ll a,b,ans; 11 ll times,max_n; 12 ll ksm(ll x,ll p){ 13 ll ans=1; 14 while (p){ 15 if (p&1) ans=(ans*x)%mod; 16 x=(x*x)%mod; 17 p=p>>1; 18 } 19 return ans; 20 } 21 int main(){ 22 cin>>n; 23 while (n--){ 24 ans=0; 25 cin>>a>>b; 26 times=a/10000; 27 max_n=a%10000; 28 for (ll i=1;i<=9999;++i){ 29 tmp=ksm(i,b); 30 if (i<=max_n){ 31 ans=(ans+tmp*(times+1))%mod; 32 }else{ 33 ans=(ans+tmp*times)%mod; 34 } 35 } 36 printf("%lld\n",ans); 37 } 38 return 0; 39 }