您的位置:首页 > 其它

HDU 4549 M斐波那契数列(构造矩阵)

2016-03-19 10:52 459 查看
题目链接:

HDU 4549 M斐波那契数列

/*
* 分析:
* 将每个数用a[0]和a[1]表示,发现a[0]和a[1]的幂的变化符合Fibonacci数列。
* 所以可以用矩阵快速幂求出相应的幂数,然后再用整数快速幂求出a[0]和a[1]的幂
* 再把结果相乘%(1e9+7)即是结果。
* 注意:
* 对于(A^B)%C,如果C是素数,且A和C互质(只有一个公因子1)
* 则等价于(A^(B%(C-1)))%C
*/
//1612K 0MS
#include <cstdio>
#include <cstring>
#include <cmath>
#include <climits>
#include <algorithm>
#include <iostream>
using namespace std;
const long long mod=(long long)(1e9+7);

struct Matrix{
int row,col;
long long data[10][10];
};

void Init(Matrix& x,int row,int col)
{
x.row=row;
x.col=col;
memset(x.data,0,sizeof(x.data));
}

Matrix Multiply(Matrix a,Matrix b)
{
Matrix ans;
Init(ans,a.row,b.col);
for(int i=1;i<=ans.row;i++){
for(int j=1;j<=ans.col;j++){
for(int k=1;k<=a.col;k++){
ans.data[i][j]+=a.data[i][k]*b.data[k][j];
ans.data[i][j]%=(mod-1);
//对于(A^B)%C,如果C是素数,且A和C互质(只有一个公因子1),
//则等价于(A^(B%(C-1)))%C
}
}
}
return ans;
}

void Unit(Matrix& x)
{
for(int i=1;i<=x.row;i++)
x.data[i][i]=1;
}

Matrix quick_power(Matrix a,long long n)
{
Matrix ans,tmp=a;
Init(ans,a.row,a.col);
Unit(ans);
while(n){
if(n&1) ans=Multiply(ans,tmp);
tmp=Multiply(tmp,tmp);
n>>=1;
}
return ans;
}

long long solve(long long a,long long n)
{
long long ans=1,tmp=a;
while(n){
if(n&1) ans=ans*tmp%mod;
tmp=tmp*tmp%mod;
n>>=1;
}
return ans%mod;
}

int main()
{
//freopen("Rin.txt","r",stdin);
//freopen("Rout.txt","w",stdout);
/*
for(int i=0;i<=100;i++)
printf("1 2 %d\n",i);
*/
long long a,b,n;
while(cin>>a>>b>>n){
a=a%mod,b=b%mod;
if(n==0){
cout<<a<<endl;
continue;
}else if(n==1){
cout<<b<<endl;
continue;
}
if(a==0||b==0){
printf("0\n");
continue;
}
else if(a==1&&b==1){
printf("1\n");
continue;
}
Matrix tmp,ans;
tmp.row=tmp.col=2;
tmp.data[1][1]=0;
tmp.data[1][2]=tmp.data[2][1]=tmp.data[2][2]=1;
ans=quick_power(tmp,n-1);
long long na=ans.data[1][2]%(mod-1);
long long nb=ans.data[2][2]%(mod-1);
//printf("a=%I64d b=%I64d na=%I64d nb=%I64d\n",a,b,na,nb);
a=solve(a,na);
b=solve(b,nb);
//printf("a=%I64d b=%I64d\n",a,b);
printf("%I64d\n",a*b%mod);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  矩阵