萌萌指数和 sum解题报告

题目:
/*
题目地址:http://www.luogu.org/problem/show?pid=T113 //东营一中ACM赛制题
题目背景 Background
当腹黑的指数遇上呆萌的模运算,(“▔□▔)/你懂得(“▔□▔)/
题目描述 Description
求1^b+2^b+3^b+……+a^b的和mod 10000的结果。
输入输出格式 Input/output
输入格式:
第一行一个整数T,表示一共有T组数据。
接下来T行,每行两个整数a,b。
输出格式:
一共T行。
每行仅一个整数表示结果。
输入输出样例 Sample input/output
样例测试点#1 输入样例:
1
2 3
输出样例:
9
说明 description
对于30%数据,T<=10, a,b<=1000
对于100%数据,T<=100, a,b<=1,000,000,000
*/
第一眼看上去,这是一个很明显的快速幂。。。快速幂加mod。但当你写出未加优化的代码,套入最长的数据(999999998 999999999),发现和(999999999 999999999)输出完全一样时,你就会发现情况不对了。为什么得出的结果一样?/都是零/然后你进行测试时,TLE*10。
这是为什么呢?那是10^10的数据,怎么测都是很多。。。。。。
好吧,我们再换种思路。然后发现,2^1=(2^4001)%10000。。。以后同理。。。ok,有救了——
附:(a^b)%c=((a%c)^b)%c
所以基本上就是走一步一mod,mod着mod着到最后就AC了。
Orzzz

Const
p=10000;
Var
a,b,i,j,k,m,n,t,o,ans:longint;
f:array[0..10000] of longint;
Function pow(a,b,n:qword):qword;
var t,y:qword;
begin
t:=1; y:=a;
while b<>0 do
begin
if(b and 1)=1 then t:=t*y mod n;
y:=y*y mod n;
b:=b shr 1;
end;
pow:=t;
end;
Begin
readln(t);
for o:=1 to t do
begin
fillchar(f,sizeof(f),0);
readln(a,b);
k:=a div p;
m:=a mod p;
if b>=4000 then b:=b mod 4000+4000;
for i:=1 to p do
f[i]:=(f[i-1]+pow(i,b,p))mod p;
ans:=(k*f[p]+f[m])mod p;
writeln(ans);
end;
end.

ok,这次是P代码。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值