洛谷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: 
1
2 3
输出样例#1: 
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 }
View Code

 

posted @ 2017-11-07 09:12  lonlyn  阅读(286)  评论(0编辑  收藏  举报