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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu4291 暴力循环节+矩阵快速幂

發布時間:2025/6/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu4291 暴力循环节+矩阵快速幂 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 給你一個關系式,x[n] = 3*x[n-1] + x[n-2],求x(x(x[n]))%1000000007.


思路:

? ? ? 做這個題目要明確一點,就是對于取余操作大多數時候都會出現循環節的情況,尤其是對于像這個題目的轉換公式,數據有規律遞增,那么也就是說0 1 1 ....等再次出現0 1的時候也就是一定找了循環節,對于這個題目我們找循環節主要不是為了防止超時,而是為了得到正確的答案,因為x[n]很大的時候就的模擬大數,就麻煩了,我們只要找到每一層的循環節,就能把數據弄小,就可以跑三次矩陣快速A掉這個題目了。

下面給出暴力循環節代碼(暴力第二層的,最內層把10..7改成第二層的MOD就行了)

#include<stdio.h>


int main ()
{
? ?__int64 a = 0 ,b = 1 ,c;
? ?for(__int64 i = 3 ; ;i ++)
? ?{
? ? ? c = (b * 3 + a)%1000000007;
? ? ? a = b ,b = c;
? ? ? if(a == 0 && b == 1)
? ? ? {
? ? ? ? ? printf("%I64d\n" ,i - 2);
? ? ? ? ? break;
? ? ? }
? ?}
? ?getchar();
? ?return 0;
}
? ? ??
暴力后得到最內側的MOD = 183120
第二層 MOD = 222222224
最外層給了 MOD = 1000000007


AC代碼


#include<stdio.h> #include<string.h> __int64 MOD1 = 183120; __int64 MOD2 = 222222224; __int64 MOD3 = 1000000007;__int64 MOD; typedef struct {__int64 mat[5][5]; }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] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;return c; } A quick_mat(A a ,__int64 b) {A c;memset(c.mat ,0 ,sizeof(c.mat));c.mat[1][1] = c.mat[2][2] = 1;while(b){if(b & 1) c = mat_mat(c ,a);a = mat_mat(a ,a);b >>= 1;}return c; }int main () {__int64 n ,i;A aa ,bb;aa.mat[1][1] = 0 ,aa.mat[1][2] = 1;aa.mat[2][1] = 1 ,aa.mat[2][2] = 3;while(~scanf("%I64d" ,&n)){if(n == 0){printf("0\n");continue;}if(n == 1){printf("1\n");continue;}MOD = MOD1;bb = quick_mat(aa ,n - 1);n = (0 * bb.mat[1][2] + 1 * bb.mat[2][2])% MOD;if(n == 0){printf("0\n");continue;}if(n == 1){printf("1\n");continue;}MOD = MOD2;bb = quick_mat(aa ,n - 1);n = (0 * bb.mat[1][2] + 1 * bb.mat[2][2])% MOD;if(n == 0){printf("0\n");continue;}if(n == 1){printf("1\n");continue;}MOD = MOD3;bb = quick_mat(aa ,n - 1);n = (0 * bb.mat[1][2] + 1 * bb.mat[2][2])% MOD;printf("%I64d\n" ,n);}return 0; }





總結

以上是生活随笔為你收集整理的hdu4291 暴力循环节+矩阵快速幂的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。