迴圈節其實就可以看做取模,一般的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...