题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=420
自己用同余定理写的代码超时:
#include<iostream>
using namespace std;
int main()
{
int t,n,p,i;
long long value,ttt=0;
cin>>t;
while(t--){
cin>>n>>p;
ttt=0;
for(i=1;i<=n;i++)
{
value=1;
for(int j=1;j<=p;j++)
{
value=value*i%10003;
}
ttt=(ttt%10003+value%10003)%10003;
}
cout<<ttt%10003<<endl;
}
return 0;
}
于是用二分法再写了一遍AC:
#include<iostream>
using namespace std;
using namespace std;
long long pow(int a,int b){
if(b==1)
return a%100003;
long long x=pow(a,b/2);
long long value=((x%10003)*(x%100003))%10003;
if(b%2==1)
value=value*a%10003;
return value;
}
int main()
{
int n,p,i,t;
cin>>t;
while(t--)
{
cin>>n>>p;
if(p==0)
{
cout<<n%10003<<endl;
continue;
}
long long sum=0;
for(i=1;i<=n;i++){
sum=((sum%10003)+(pow(i,p)%10003))%10003;
}
cout<<sum<<endl;
}
return 0;
}