poj3734--pascal题解

原题目: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.

再次声明:

请自行百度快速幂

你可能感兴趣的:(源代码,编程语言)