快速幂取模 PKU ACM 3070

以前从没有对Olog N)和ON)的区别有所正确认识,今日总算知道了。它们的唯一区别就是,N是一亿的时候,log(N)就是不到26N还是一亿。

http://acm.pku.edu.cn/JudgeOnline/problem?id=3070

PKU的这道题虽然容易,但的确很有意思。我也是第一次用快速幂取模,一用,果然不同凡响。

快速幂取模,其实就是秦九韶算法 取指数。

 n化成二进制形式后,得到一个多项式,写成秦九韶形式,多项式的加就是乘,乘则为指数运算(指数为2)。由于N的二进制位个数为log(n),这样把ON)的问题化为Olog N)。

.


//PKU 3070 ,calculate Fibonacci 
#include <iostream>
#include
<stack>
int FPM(int);//fast-power-modulus function declare
using namespace std;
const int Mod=10000;
int main(int argc, char *argv[])
{
    
int n=0;
    
while(scanf("%d",&n))
    
{
        
if(n==-1)
            
break;
        printf(
"%d\n",FPM(n));
    }

    
    
return 0;
}

int FPM(int n)//fast-power-modulus function
{
    
int matr[4]={1,0,0,1};//initialize matrix
    stack<bool>dec;//stack to store binary digit
    while(n)//resolve n to binary digit
    {
        dec.push(
1&n);//get the last binary digit
        n>>=1;
    }

    
while(!dec.empty())
    
{
     
//matrix square
        matr[1]=((matr[0]+matr[3])*matr[1])%Mod;
        matr[
0]=(matr[0]*matr[0]+matr[2]*matr[2])%Mod;
        matr[
3]=(matr[3]*matr[3]+matr[2]*matr[2])%Mod;
        matr[
2]=matr[1];
    
//matrix multiply,
        if(dec.top())
        
{
            matr[
0]=(matr[0]+matr[1])%Mod;
            matr[
1]=(matr[1]+matr[3])%Mod;
            matr[
3]=matr[2];
            matr[
2]=matr[1];
        }

        dec.pop();
    }

    
return matr[1];//matr[1] is the result F[N]

}

posted on 2009-08-16 01:35 若余 阅读(2428) 评论(1)  编辑 收藏 引用

评论

# re: 快速幂取模 PKU ACM 3070 2011-04-16 16:59 呢喃的歌声

求这段的具体解释,秦九韶算法我也看过了,博主可以再点播一下吗?
//matrix square
matr[1]=((matr[0]+matr[3])*matr[1])%Mod;
matr[0]=(matr[0]*matr[0]+matr[2]*matr[2])%Mod;
matr[3]=(matr[3]*matr[3]+matr[2]*matr[2])%Mod;
matr[2]=matr[1];
//matrix multiply,
if(dec.top())
{
matr[0]=(matr[0]+matr[1])%Mod;
matr[1]=(matr[1]+matr[3])%Mod;
matr[3]=matr[2];
matr[2]=matr[1];
}  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2011年4月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

常用链接

留言簿

随笔档案(16)

搜索

最新随笔

最新评论

评论排行榜