迴圈節 矩陣快速冪 HDU4291

2021-09-24 19:42:56 字數 1506 閱讀 1317

迴圈節其實就可以看做取模,一般的1e9 + 7其實就是個迴圈節,只是大了點……

切入正題 hdu4291

g(x)很明顯的矩陣快速冪

本地直接暴力找迴圈節

ll a = 0, b = 1;

for(int i = 2; ; ++i)

一定要 開 long long !!!

我沒開 long long 卡了乙個多小時嗚嗚嗚嗚嗚

三個g巢狀,就分了三個迴圈節

我最開始沒有把迴圈節的概念弄清楚,寫成了這樣

n = quickpoww(n % mod3).m[0][1];//g(g(g(x)))的迴圈節為 mod3

n = quickpoww(n % mod2).m[0][1];//g(g(x)) 的迴圈節為 mod2

n = quickpoww(n % mod1).m[0][1];//g(x)的迴圈節為mod1

在得到迴圈節的情況下快速冪直接對1e9+7取模

自然就……

其實仔細一想,對變數取模就是利用了當前函式的迴圈節,而對於當前函式對外面一層的函式(巢狀情況下)的迴圈節則是對函式值(此時已是作為變數)取模。

例如,對於g(g(g(x))),x

的迴圈節為240,而x對240取模後算出的g(x)在函式g(g(g(x)))中的迴圈節則是183120,即第二層取模應取183120。至於1e9+7,它只不過是最外面一層函式的迴圈節

while(scanf("%lld", &n) != eof)
其實1e9+7也不過是最外面一層的迴圈節而已,不能當成「萬能取模」隨便用到快速冪裡面,對於不同的迴圈節有不同的模值。

最後ac**:

#include#define ll long long

#define maxn 2

static const int mod0 = 1000000007;

static const int mod1 = 222222224;

static const int mod2 = 183120;

static const int mod3 = 240;

using namespace std;

typedef struct matrixmatrix;

matrix mat_muti(matrix a, matrix b, int mod)

return ans;

}matrix quickpoww(int n, int mod)

return ans;

}int main()

return 0;

}

矩陣快速冪 迴圈節 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

題意 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 並且超時的。那麼...

hdu 4291 矩陣冪 迴圈節

凡是取模的都有迴圈節 常數有,矩陣也有,並且矩陣的更奇妙 g g g n mod 10 9 7 最外層mod 1e9 7 能夠算出g g n 的迴圈節222222224。進而算出g n 的迴圈節183120ll。然後由內而外計算就可以 凝視掉的是求迴圈節的 pragma comment linker...