hdu5451 迴圈群,矩陣快速冪

2021-09-01 03:04:46 字數 2068 閱讀 8002

先看簡單點的。求 (5+2*√(6))^n % 1024

第一種構造:

原文: 

第二種:

令an = (5 + 2√6)^n,bn = (5 - 2√6)^n

sn = an + bn;

顯然sn是正整數,且bn是小於1的

所以答案就是sn - 1!

(5 + 2√6) + (5 - 2√6) = 10;

sn* [(5 + 2√6) + (5 - 2√6)] 

= ((5 + 2√6)n + (5 - 2√6)n) * [(5 + 2√6) + (5 - 2√6)] 

= (5 + 2√6)^(n+1) + (5 - 2√6)^(n+1) + (5 + 2√6)^(n-1) + (5 - 2√6)^(n-1)

∴10 * sn = sn+1 + sn-1

sn+1 = 10 * sn - sn-1

sn = 10*sn-1 - sn-2;

到這裡我們就可以通過構造矩陣來解決了!

| sn   |      |10    -1|      | sn-1|

| sn-1| =  |1       0 | *  | sn-2|

然後再看乙個更難的:

記an=(a+sqrt(b))^n,bn=(a-sqrt(b))^n  cn=an+bn,很容易知道。。 cn是整數,

然後由於a b的範圍可以知道bn在0-1開區間之間,因此sn=[cn]%mod,接下來對cn進行配項。。。

cn+1=(a+sqrt(b))^n*(a+sqrt(b))+(a-sqrt(b))^n*(a-sqrt(b)),貌似沒啥用,但是要充分利用共軛這個式子。

要想辦法讓(a+sqrt(b))*(a-sqrt(b))=a*a-b派上用場,然後繼續去把它拿去配項。。。

一開始我拿cn*(a*a-b)未果,於是用cn-1*(a*a-b)結合上述的cn+1就得到了:

cn+1=(a+sqrt(b))^n*(a+sqrt(b))+(a-sqrt(b))^n*(a-sqrt(b))

cn-1*(a*a-b)=(a+sqrt(b))^n*(a-sqrt(b))+(a-sqrt(b))^n*(a+sqrt(b))

加減消去根號項得到:cn+1=2*a*cn+(b-a*a)*cn-1,公式化簡完畢,2*2階矩陣可以直接寫了:

然後看這神仙題

根據上面的分析知道是

這裡x巨大無比,題解說是迴圈群,找到迴圈節(迴圈節和模數m有關)以後把指數部分模一下迴圈節再矩陣快速冪。

orz。

至於為什麼是矩陣迴圈群?不如問問神奇的海螺?

不過既然被知道是迴圈群了,那麼生成元是

的n。求到的迴圈節可以儲存下來,暴力求,至於為什麼暴力求,你為什麼不問問神奇的海螺?,應該是t是10^3,m是10^4,不卡常也就過了。。

#include #include #include #include #include #include using namespace std;

const int n = (1<<8)+5;

const int m = 50000;

typedef long long ll;

#define se second

#define fi first

#define rep(i, n, m) for(int i = (n); i <= (m); i++)

struct mat

}i;mat mul(mat a, mat b, int mod)

return ans;

}mat matpower(mat a, ll b, ll mod)

return ans;

}ll power(ll a, ll b, ll mod)

return ans;

}int cir[m], mod[m], t, x, m;

mat a, b, ans;

void findmod(ll mod)

}//cir[0] =

}int main ()

return 0;

}

hdu 5451 共軛數 矩陣快速冪 迴圈節

這個題構造矩陣這裡就不講了,詳情見hdu 2256 這個題由於 這裡先說下方法,不說為什麼 因為我也沒弄懂qaq 迴圈節就是mod mod 1,這樣把指數 include include include using namespace std typedef long long int ll int...

矩陣快速冪 迴圈節 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巢狀,就分...