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];
}
}
}
后面的见下篇
posted @ 2010-08-15 18:03  open source  阅读(189)  评论(0编辑  收藏  举报