题意:求(1^m+2^m+3^m+……+n^m)%(1e9+7)
1.利用公式a*b%c=(a%c*b%c)%c 或a*b%c=(a%c*b)%c 求a^b%c会超时
2.(a+b)%c=(a%c+b%c)%c
3.(a-b)%c=(a%c+n*c-b)%c 其中a>b,n要保证n*c-b>0,且最好n尽量小
#include<cstdio>
#include<cstring>
using namespace std;
const long long c=1e9+7;
long long fun(long long a,long long b)
{
long long ans=1;
while(b--)
{
ans=(ans*a%c)%c;
}
return ans;
}
int main()
{
long long n,m;
long long ans;
//long long snm;
while(scanf("%lld%lld",&n,&m)==2)
{
ans=0;
for(int i=n;i>=1;i--)
{
ans=(ans+fun(i,m))%c;
}
printf("%lld\n",ans);
}
return 0;
}
二分超时:
#include<cstdio>
#include<cstring>
using namespace std;
const long long c=1e9+7;
long long q_mod(long long a,long long b)
{
long long ans=1;
while(b>0)
{
if(b&1)
ans=ans*a%c;
a=a*a%c;
b=b/2;
}
return ans;
}
int main()
{
long long n,m;
long long ans;
while(scanf("%lld%lld",&n,&m)==2)
{
ans=0;
for(int i=n;i>=1;i--)
{
ans=(ans+q_mod(i,m))%c;
}
printf("%lld\n",ans);
}
return 0;
}