bzoj 2751 快速幂

首先我们知道,对于所有种情况,我们可以将每一位可以放的

数的值加起来,所有位置的乘起来,等于的就是最后的答案,具体

为什么正确,可以根据乘法分配律来想一想。

那么对于所有不做要求的,快速幂直接算就行了,然后快排下,就知道

每个位置不放那些值,减掉后乘进去就行了。

/**************************************************************
    Problem: 2751
    User: BLADEVIL
    Language: Pascal
    Result: Accepted
    Time:344 ms
    Memory:1008 kb
****************************************************************/
 
//By BLADEVIL
const
    d39                                 =1000000007;
     
var
    n, m, k                             :longint;
    a, b                                :array[0..100010] of longint;
    ans                                 :int64;
     
procedure swap(var a,b:longint);
var
    c                                   :longint;
begin
    c:=a; a:=b; b:=c;
end;
     
procedure qs(low,high:longint);
var
    i, j, xx, yy                        :longint;
begin
    i:=low; j:=high; 
    xx:=a[(i+j) div 2]; yy:=b[(i+j) div 2];
    while i<j do
    begin
        while (a[i]<xx) or (a[i]=xx) and (b[i]<yy) do inc(i);
        while (a[j]>xx) or (a[j]=xx) and (b[j]>yy) do dec(j);
        if i<=j then
        begin
            swap(a[i],a[j]);
            swap(b[i],b[j]);
            inc(i); dec(j);
        end;
    end;
    if i<high then qs(i,high);
    if j>low then qs(low,j);
end;
     
procedure init;
var
    i                                   :longint;
begin
    read(n,m,k);
    for i:=1 to k do read(a[i],b[i]);
    qs(1,k);
end;
 
function mi(a,b:int64):int64;
var
    sum                                 :int64;
begin
    sum:=a;
    mi:=1;
    while b<>0 do
    begin
        if b mod 2=1 then mi:=mi*sum mod d39;
        sum:=sum*sum mod d39;
        b:=b div 2;
    end;
end;
 
procedure main;
var
    i                                   :longint;
    sum, x, y, z                        :int64;
begin
    sum:=m;
    x:=-1;
    for i:=1 to k do
    begin
        if a[i]<>x then
        begin
            dec(sum);
            x:=a[i];
        end;
    end;
    x:=n; y:=n+1;
    if x mod 2=0 then x:=x div 2 else y:=y div 2;
    x:=x mod d39;
    y:=y mod d39;
    x:=x*y mod d39;
    ans:=mi(x,sum);
    for i:=1 to k do if (a[i]=a[i-1]) and (b[i]=b[i-1]) then b[i-1]:=0;
    y:=-1;
    z:=-1;
    for i:=1 to k do
    begin
        if a[i]<>y then
        begin
            if i<>1 then ans:=ans*z mod d39;
            z:=x;
            y:=a[i];
            z:=((x-b[i]) mod d39+d39) mod d39;
        end else z:=((z-b[i])mod d39+d39) mod d39;
    end;
    if z<>-1 then ans:=ans*z mod d39;
    writeln(ans);
end;
     
 
begin
    init;
    main;
end.

 

posted on 2013-12-25 21:05  BLADEVIL  阅读(291)  评论(0编辑  收藏  举报