poj 3070
按照快速幂是思路
int
pow4(
int
a,
int
b){
int
r=1,base=a;
while
(b){
if
(b&1) r*=base;
base*=base;
b>>=1;
}
return
r;
}
并且通过学长,理解了b>>1(本质上是个bool值)和b>>=1的区别;
代码如下
第一种
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int Mod=10000;
int fast_mod(int n){
int r[2][2]={1,0,0,1};
int base[2][2]={1,1,1,0};
while(n){
int t[2][2];
if(n&1){
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
t[i][j]=r[i][j];
memset(r,0,sizeof(r));
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
for(int k=0;k<2;k++)
{
r[i][j]=(r[i][j]+t[i][k]*base[k][j])%Mod;
}
}
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
t[i][j]=base[i][j];
memset(base,0,sizeof(base));
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
for(int k=0;k<2;k++)
{
base[i][j]=(base[i][j]+t[i][k]*t[k][j])%Mod;
}
}
}
n>>=1;
}
return r[0][1];
}
int main()
{
int n;
while(~scanf("%d",&n)&&n!=-1){
printf("%d\n",fast_mod(n));
}
return 0;
}
第二种
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int Mod=10000;
struct matrix
{
int m[2][2];
}r,base;
matrix multiply(matrix a,matrix b)
{
matrix t;
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
t.m[i][j]=0;
for(int k=0;k<2;k++)
t.m[i][j]=(t.m[i][j]+a.m[i][k]*b.m[k][j])%Mod;
}
}
return t;
}
int fast_mod(int n){
r.m[0][0]=1; r.m[0][1]=0; r.m[1][0]=0; r.m[1][1]=01;
base.m[0][0]=1; base.m[0][1]=1; base.m[1][0]=1; base.m[1][1]=0;
while(n){
if(n&1){
r=multiply(r,base);
}
base=multiply(base,base);
n>>=1;
}
return r.m[0][1];
}
int main()
{
int n;
while(~scanf("%d",&n)&&n!=-1){
printf("%d\n",fast_mod(n));
}
return 0;
}