您的位置:首页 > 编程语言

poj3734--pascal题解

2017-05-02 17:15 190 查看
原题目:http://poj.org/problem?id=3734

请自行百度快速幂

这题只有两个样例,乍一看也看不出什么来……

但如果手动多试几组数据呢?

多试一下会得到如下结果:

读入 n : —1—2—3—4—5……

输出 ans :-2—6–20–72–272……

而 2=1*2,6=2*3,20=4*5,72=8*9,272=16*17……

每个式子提取较小的因数,则会得到:1,2,4,8,16……

分别是2的0、1、2、3、4……次方,

所以结果也就出来了:



好的结束……才没有。

本题n的范围是1<=n<=10^9,如果直接求幂会炸……

你需要快速幂~

var t,i,l,n,j:longint;
a,b:array[0..31]of longint;
begin
a[0]:=1;b[0]:=2;
for i:=1 to 30 do begin
a[i]:=a[i-1]*2;
b[i]:=b[i-1]*b[i-1]mod 10007;
end;
readln(t);
for i:=1 to t do begin
readln(n);l:=1;n:=n-1;
for j:=30 downto 0 do
if a[j]<=n then begin
l:=l*b[j]mod 10007;
n:=n-a[j];
if n=0 then break;
end;
l:=(l*(l+1))mod 10007;
writeln(l);
end;
end.


再次声明:

请自行百度快速幂

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 题目 数据 源代码