hdu 4291矩陣快速冪

2022-08-17 23:03:15 字數 2705 閱讀 4345

這題是去年成都網路賽的題,當時沒做出來,杯具呀。

其實最關鍵的就是要懂得取餘一定會迴圈的,如果能夠找出迴圈節,就是乙個巨大的突破。然後就是g(n)的求法,很顯然硬求是不可能的,我們去年做這題的時候試圖去找g(n)的通項公式,都找得差不多了,但實際上那毫無意義。因為我們是要找迴圈節,所以應該一層層地找。先看g(n) % 1000000007到**會迴圈。可以用矩陣的方法求g(n),暴力打出來,發現迴圈節是222222224。再來看g(g(n)) % 1000000007到**會迴圈。因為g(g(n)) % 1000000007對g(n)每隔222222224結果就會迴圈一次,所以g(g(n)) % 1000000007 = g(g(n) % 222222224) % 1000000007。所以g(n) % 222222224的迴圈節也就是g(g(n)) % 1000000007的迴圈節。暴力求出來是183120。最後再看g(g(g(n))) % 1000000007的迴圈節。同理g(n) % 183120的迴圈節就是g(g(g(n))) % 1000000007的迴圈節。暴力求出來是240。也就是說,最後的結果,n每隔240就會迴圈。所以最後的結果就是g(g(g(n % 240) % 183120) % 222222224) % 1000000007。用矩陣快速冪就可以過了。

我的暴力求迴圈節的**如下:

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int max_order = 2

;const

int mod = 1000000007

;typedef

long

long

typec;

typedef

struct

mymatrix

inline

void

init()

} mymatrix;

//矩陣乘法。注意:ma.col與mb.row一定要相等,否則會出問題

mymatrix operator*(mymatrix ma, mymatrix mb) }}

return

numc;}//

矩陣快速冪。注意:ma.col與ma.row一定要相等,否則會出問題

mymatrix mpow(mymatrix ma, int

x)

for (; x; x >>= 1

) ma = ma *ma;

}return

numc;

}int

main()

}return0;

}

最後通過的**如下:

/*

* hdu4291/win.cpp

* created on: 2012-11-4

* author : ben */

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int max_order = 2

;int

mod;

typedef

long

long

typec;

typedef

struct

mymatrix

inline

void

init()

} mymatrix;

//矩陣乘法。注意:ma.col與mb.row一定要相等,否則會出問題

mymatrix operator*(mymatrix ma, mymatrix mb) }}

return

numc;}//

矩陣快速冪。注意:ma.col與ma.row一定要相等,否則會出問題

mymatrix mpow(mymatrix ma, int

x)

for (; x; x >>= 1

) ma = ma *ma;

}return

numc;

}inline mymatrix getori()

inline mymatrix gettran()

intmain()

return0;

}

矩陣快速冪 迴圈節 hdu4291

題意 given n 1 n 1018 you should solve for g g g n mod 109 7 where g n 3g n 1 g n 2 g 1 1 g 0 0 分析 這個遞推關係可以用矩陣快速冪來解決,但是這個題的問題是mod很大,會爆long long 並且超時的。那麼...

迴圈節 矩陣快速冪 HDU4291

迴圈節其實就可以看做取模,一般的1e9 7其實就是個迴圈節,只是大了點 切入正題 hdu4291 g x 很明顯的矩陣快速冪 本地直接暴力找迴圈節 ll a 0,b 1 for int i 2 i 一定要 開 long long 我沒開 long long 卡了乙個多小時嗚嗚嗚嗚嗚 三個g巢狀,就分...

矩陣快速冪 迴圈節 hdu4291

題意 given n 1 n 1018 you should solve for g g g n mod 109 7 where g n 3g n 1 g n 2 g 1 1 g 0 0 分析 這個遞推關係可以用矩陣快速冪來解決,但是這個題的問題是mod很大,會爆long long 並且超時的。那麼...