HDU4549 M斐波那契数列【矩阵快速幂】

题意:F0 = a ,F1 = b ,Fn Fn-1 * Fn-2  (n > 1),求Fn


思路:F2 = a*b

          F3 = a*b^2

         F4 = a^2*b^3

         F5 = a^3*b^5

         F6 = a^5*b^8

         观察易得:

         Fn = a^fib(n-1) * b^fib(n) % MOD

          想当然的给它的指数mod了下,a^b % m,带值2 4 3。正确是1,mod后是2

          其实正确的是:

     a^b % m,m是质数,而且a,m是互质的。           根据欧拉定理a^(b%(m-1)) % m

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 5;int MOD,N,a[maxn];
struct data
{ll s[maxn][maxn];
}res,tp;void init()
{memset(res.s,0,sizeof res.s);memset(tp.s,0,sizeof tp.s);for(int i = 1; i <= N; i++)res.s[i][i] = 1;tp.s[1][1] = tp.s[1][2] = tp.s[2][1] = 1;
}struct data mat(struct data &x,struct data &y)
{struct data temp;memset(temp.s,0,sizeof temp.s);for(int i = 1; i <= N; i++){for(int j = 1; j <= N; j++){for(int k = 1; k <= N; k++){temp.s[i][j] += x.s[i][k] * y.s[k][j];temp.s[i][j] %= (MOD-1);}}}return temp;
}struct data mpow(struct data &a,ll b)
{while(b){if(b&1) res = mat(res,a);b >>= 1;a = mat(a,a); }return res;
}ll kuai(ll a,ll b)
{ll res = 1;while(b){if(b&1) res = res * a % MOD;b >>= 1;a = a * a % MOD;}return res;
}int main(void)
{ll n,m,a,b;ll A,B;MOD = 1e9+7;N = 2;while(scanf("%lld%lld%lld",&a,&b,&n)!=EOF){if(n == 0){printf("%lld\n",a);continue;}else if(n == 1){printf("%lld\n",b);continue;}else{init();res = mpow(tp,n);A = res.s[2][1] % (MOD-1);B = res.s[1][1] % (MOD-1);//printf("%d %d\n",A,B);}ll ans = kuai(a,A) % MOD;ans = ans * kuai(b,B) % MOD;ans = ( (ans%MOD)+MOD ) % MOD;printf("%lld\n",ans);}return 0;
}




本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部