版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37868325/article/details/88849825
题意:
现在给出a, b, n,你能求出F[n]的值吗?
Input
每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 )
Output
对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可,每组数据输出一行。
Sample Input
0 1 0 6 10 2
Sample Output
0 60

设

则



,求出ab的指数后,在快速幂就可以了
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define maxn 10 #define mod 1000000007 ///n行m列的矩阵 struct AA { ll n,m,a[maxn][maxn]; void mem1() { memset(a,0,sizeof(a));///n=m时,初始化为单位阵 for(int i=0;i<n;i++) a[i][i]=1; } }; ///n行m列的aa矩阵 * m行k列的bb矩阵 AA mul(AA aa,AA bb,int n,int m,int kk) { AA cc; cc.n=cc.m=2; for(int i=0;i<n;i++) { for(int j=0;j<kk;j++) { int x=0; for(int k=0;k<m;k++) { x+=(aa.a[i][k]*bb.a[k][j])%(mod-1); x%=(mod-1); } cc.a[i][j]=x; } } return cc; } ///方阵aa的m次方 AA POW(AA aa,ll m) { AA d;d.n=d.m=2; d.mem1(); while(m) { if(m&1) { d=mul(d,aa,2,2,2); } m/=2; aa=mul(aa,aa,2,2,2); } return d; } ll pp(ll i,ll j) { ll zz=1; while(j) { if(j&1) {zz*=i;zz%=mod;} j/=2; i*=i; i%=mod; } return zz; } ll n,a,b,x,y; int main() { while(~scanf("%lld%lld%lld",&a,&b,&n)) { if(n==0) { printf("%lld\n",a%mod); } else if(n==1) { printf("%lld\n",b%mod); } else { AA aa,bb;aa.n=aa.m=2; aa.a[0][0]=1;aa.a[0][1]=1; aa.a[1][0]=1;aa.a[1][1]=0; AA cc=POW(aa,n-1); bb.a[0][0]=1; bb.a[1][0]=0; cc=mul(cc,bb,2,2,1); printf("%lld\n",(pp(a,cc.a[1][0])*pp(b,cc.a[0][0]))%mod); } } }
文章来源: https://blog.csdn.net/qq_37868325/article/details/88849825