汗啊,代码长度超过字数限制!
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
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];
}
}
}
后面的见下篇