您的位置:首页 > 其它

萌萌指数和 sum解题报告

2015-09-30 20:40 274 查看
题目:

/*

题目地址: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代码。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: