先看簡單點的。求 (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巢狀,就分...