题目描述:
http://acm.nyist.net/JudgeOnline/problem.php?pid=420
-
一个很简单的问题,求1^p+2^p+3^p+……+n^p的和。
-
输入
-
第一行单独一个数字t表示测试数据组数。接下来会有t行数字,每行包括两个数字n,p,
输入保证0<n<=1000,0<=p<=1000。
输出
- 输出1^p+2^p+3^p+……+n^p对10003取余的结果,每个结果单独占一行。 样例输入
-
210 110 2
样例输出
-
55385
-
第一行单独一个数字t表示测试数据组数。接下来会有t行数字,每行包括两个数字n,p,
题目分析:
快速幂+同余定理的问题,虽然已经写了好多次的快速幂但是还是没有记住,每次都是看模板,这次一定记住它。
AC代码:
/**
*快速幂取摸+同余
*/
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cctype>
#include<cstring>
#include<cmath>
using namespace std;
int mod(int a,int b,int n){
int t = 1;
if (b == 0)
return 1;
if (b == 1)
return a%n;
t = mod(a, b>>1, n);
t = t*t % n;
if (b&1){//b是奇数
t = t*a % n;
}
return t;
}
int main()
{
int t;
cin>>t;
while(t--){
int p,n;
cin>>n>>p;
int res=0;
for(int i=1;i<=n;i++){
int t=mod(i,p,10003);
//cout<<t<<endl;
res=(res%10003+t%10003)%10003;
}
cout<<res<<endl;
}
return 0;
}