• hdoj1588(1)


    汗啊,代码长度超过字数限制!

    Problem : 1588 ( Gauss Fibonacci )     Judge Status : Accepted
    RunId : 2824040    Language : G++    Author : huwenbiao
    Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
    /***************************************************************\
    *Author:Hu Wenbiao
    *Created Time: Sun 15 Aug 2010 04:07:57 PM CST
    *File Name: main.cpp
    *Description:数论问题。用矩阵的反复平方法处理
    \***************************************************************/

    //*========================*Head File*========================*\\

    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    /*----------------------*Global Variable*----------------------*/
    long long
    A[
    3][3],B[3][3],C[3][3],D[3][3],K[3][3],S[3][3],T[3][3];
    int
    k,b,n,M;
    long long
    ans;

    //*=======================*Main Program*=======================*//
    using namespace std;

    void
    getB(){
    bool
    dig[
    10];
    int
    cnt=
    0;
    while
    (b){
    dig[cnt++]=b&
    1;
    b>>=
    1;
    }

    B[
    1][1]=B[2][2]=1;//B=E
    B[1][2]=B[2][1]=0;
    while
    (cnt--){
    memset(D,
    0,sizeof(D));
    for
    (int i=
    1;i<=2;i++)
    for
    (int j=
    1;j<=2;j++)
    for
    (int k=
    1;k<=2;k++){
    D[i][j]+=B[i][k]*B[k][j];
    D[i][j]%=M;
    }

    if
    (dig[cnt]){
    memset(B,
    0,sizeof(B));
    for
    (int i=
    1;i<=2;i++)
    for
    (int j=
    1;j<=2;j++)
    for
    (int k=
    1;k<=2;k++){
    B[i][j]+=D[i][k]*A[k][j];
    B[i][j]%=M;
    }
    }

    else
    {
    B[
    1][1]=D[1][1];
    B[
    1][2]=D[1][2];
    B[
    2][1]=D[2][1];
    B[
    2][2]=D[2][2];
    }
    }
    }

    void
    getK(){
    bool
    dig[
    10];
    int
    cnt=
    0;
    while
    (k){
    dig[cnt++]=k&
    1;
    k>>=
    1;
    }

    K[
    1][1]=K[2][2]=1;//K=E
    K[1][2]=K[2][1]=0;
    while
    (cnt--){
    memset(D,
    0,sizeof(D));
    for
    (int i=
    1;i<=2;i++)
    for
    (int j=
    1;j<=2;j++)
    for
    (int k=
    1;k<=2;k++){
    D[i][j]+=K[i][k]*K[k][j];
    D[i][j]%=M;
    }

    if
    (dig[cnt]){
    memset(K,
    0,sizeof(K));
    for
    (int i=
    1;i<=2;i++)
    for
    (int j=
    1;j<=2;j++)
    for
    (int k=
    1;k<=2;k++){
    K[i][j]+=D[i][k]*A[k][j];
    K[i][j]%=M;
    }
    }

    else
    {
    K[
    1][1]=D[1][1];
    K[
    1][2]=D[1][2];
    K[
    2][1]=D[2][1];
    K[
    2][2]=D[2][2];
    }
    }
    }
    后面的见下篇
  • 相关阅读:
    离场飞越转弯全家福
    画一个PBN大角度飞越转弯保护区
    画一个小角度飞越转弯保护区
    Point Estimation
    Random variable
    心流
    Survey sampling
    Distribution
    数学分析总结
    topological space
  • 原文地址:https://www.cnblogs.com/Open_Source/p/1904894.html
Copyright © 2020-2023  润新知