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.

再次声明:

请自行百度快速幂
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值