這題是去年成都網路賽的題,當時沒做出來,杯具呀。
其實最關鍵的就是要懂得取餘一定會迴圈的,如果能夠找出迴圈節,就是乙個巨大的突破。然後就是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 並且超時的。那麼...