zoukankan      html  css  js  c++  java
  • hdu 4549(快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4549

    思路:大牛思路:简单推导下有,  a, b, a^1*b^1, a^1*b^2 .... 可以知道a,b的幂满足Fib, 然后构造矩阵快速幂...就好了.还需要个性质: A^X = A^( X mod Eular(M) ) ( mod M ) .

    然后我就郁闷啦,自己的代码怎么都过不了,orz...

    一下是wa代码,哪个大神帮忙看看:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 using namespace std;
     6 #define MOD 1000000007
     7 typedef long long ll;
     8 struct Matrix{
     9     ll map[2][2];
    10 };
    11 Matrix Mata,Unit;
    12 
    13 
    14 void Initaite(){
    15     Unit.map[0][0]=Unit.map[1][1]=1;
    16     Unit.map[0][1]=Unit.map[1][0]=0;
    17 
    18     Mata.map[0][0]=0;
    19     Mata.map[0][1]=1;
    20     Mata.map[1][0]=1;
    21     Mata.map[1][1]=1;
    22 }
    23 
    24 Matrix Mul(const Matrix &p,const Matrix &q){
    25     Matrix r;
    26     memset(r.map,0,sizeof(r.map));
    27     for(int i=0;i<2;i++){
    28         for(int j=0;j<2;j++){
    29             for(int k=0;k<2;k++){
    30                 r.map[i][j]=(r.map[i][j]+p.map[i][k]*q.map[k][j])%(MOD-1);
    31             }
    32         }
    33     }
    34     return r;
    35 }
    36 
    37 Matrix Pow(int n){
    38     Matrix q=Unit,p=Mata;
    39     while(n){
    40         if(n&1){
    41             q=Mul(p,q);
    42         }
    43         n>>=1;
    44         p=Mul(p,p);
    45     }
    46     return q;
    47 }
    48 
    49 ll PPow(ll x,ll n){
    50     ll p=x,q=1;
    51     while(n){
    52         if(n&1){
    53             q=p*q%MOD;
    54         }
    55         n>>=1;
    56         p=p*p%MOD;
    57     }
    58     return q;
    59 }
    60 
    61 
    62 int main(){
    63     Initaite();
    64     int a,b,n;
    65     while(~scanf("%d%d%d",&a,&b,&n)){
    66         if(n==0)printf("%d\n",a);
    67         else if(n==1)printf("%d\n",b);
    68         else {
    69             Matrix Mat1=Pow(n-1);
    70             ll x1=Mat1.map[1][1],x2=Mat1.map[0][1];
    71         //    cout<<x1<<x2<<endl;
    72             ll ans=PPow(a,x1)*PPow(b,x2)%MOD;
    73            printf("%d\n",(int)ans);
    74         }
    75     }
    76     return 0;
    77 }
    View Code
  • 相关阅读:
    python基础学习笔记(五)
    python进阶学习笔记(一)
    python基础学习笔记(七)
    LoadRunner 技巧之 脚本设计
    python基础学习笔记(八)
    python基础学习笔记(三)
    python基础学习笔记(十一)
    性能测试知多少性能分析与调优的原理
    python基础学习笔记(十)
    python基础学习笔记(六)
  • 原文地址:https://www.cnblogs.com/wally/p/3088160.html
Copyright © 2011-2022 走看看