日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu3117 斐波那契前后4位

發(fā)布時(shí)間:2025/6/17 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu3117 斐波那契前后4位 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
? ? ? 求斐波那契的前后4位,n <= 10^8.
思路:
? ? ? 至于前四位,和hdu1568的求法一樣:
? ? ? http://blog.csdn.net/u013761036/article/details/38726907
后四位也很好求,后四位我們可以用矩陣+快速冪去求,斐波那契的矩陣
很好推
x0 x1 * ?0 1 ?= ?x1 x2?
? ? ? ? ?1 1

這樣就直接ok了,后四位直接在跑矩陣的時(shí)候?qū)?0000取余就行了。?

#include<stdio.h> #include<string.h> #include<math.h> typedef struct {__int64 mat[3][3]; }A;A mat_mat(A a ,A b) {A c;memset(c.mat ,0 ,sizeof(c.mat)); for(int k = 1 ;k <= 2 ;k ++)for(int i = 1 ;i <= 2 ;i ++)if(a.mat[i][k])for(int j = 1 ;j <= 2 ;j ++){c.mat[i][j] += (a.mat[i][k]) * (b.mat[k][j]);c.mat[i][j] %= 10000;}return c; }A quick_mat(A a ,int b) {A c;memset(c.mat ,0 ,sizeof(c.mat));for(int i = 1 ;i <= 2 ;i ++)c.mat[i][i] = 1;while(b){if(b&1) c = mat_mat(c ,a);a = mat_mat(a ,a);b >>= 1;}return c; }int num[40];void ini() {num[0] = 0 ,num[1] = 1;for(int i = 2 ;i<= 39 ;i ++)num[i] = num[i-1] + num[i-2]; }int main () {ini();int n;A aa;while(~scanf("%d" ,&n)){if(n <= 39){printf("%d\n" ,num[n]);continue;}double now = -0.5 * log10(5.0) + n * 1.0 * log10((1+sqrt(5.0))/2);double bit = now - int(now);int a = int(pow(10.0 ,bit) * 1000);aa.mat[1][1] = 0;aa.mat[2][1] = aa.mat[1][2] = aa.mat[2][2] = 1;aa = quick_mat(aa ,n);int b = 0 * aa.mat[1][1] + 1 * aa.mat[2][1];printf("%d...%04d\n" ,a ,b);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的hdu3117 斐波那契前后4位的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。