题目描述
求
1b+2b+……+ab
的和,对10000取模。
多组数据。
T<=100,a,b<=10^9
题解
一个很显然的性质:
ib≡(i+p)b(modp)
所以只要用快速幂计算出来
1b……10000b
的值然后几个计算就可以了。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define LL long long
#define Mod 10000
int n;
LL a,b,ans[Mod+5],s[Mod+5],ANS;
inline LL fast_pow(LL a,LL p)
{
LL ans=1;
for (;p;p>>=1,a=(a*a)%Mod)
if (p&1)
ans=(ans*a)%Mod;
return ans;
}
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
scanf("%d",&n);
while (n--)
{
scanf("%I64d%I64d",&a,&b);
for (int i=1;i<=Mod;++i)
ans[i]=fast_pow(i,b),s[i]=(s[i-1]+ans[i])%Mod;
LL t=a/Mod;
ANS=s[Mod]*t%Mod;
t=a%Mod;
ANS=(ANS+s[t])%Mod;
printf("%I64d\n",ANS);
}
}
总结
1、打表大法好!
2、遇到数学题不要懵,打表找规律要耐心一些,有一些结论想想就是对的。