1. 程式人生 > >2018.09.27【BZOJ5221】偏題(矩陣快速冪)(數學推理)

2018.09.27【BZOJ5221】偏題(矩陣快速冪)(數學推理)

【問題描述】

斐波那契數列是一個經典遞推數列,即Fibn=Fibn1+Fibn2Fib_n=Fib_{n-1}+Fib_{n-2}
在這個問題中,定義一個新數列,對於n2n ≥ 2Fn=Fn1+Fn2+3+Fn1Fn2F_n=F_{n-1}+F_{n-2}+\sqrt{3+F_{n-1}F_{n-2}}
對於給出的四個整數F0,F1,M,nF_0,F_1,M,n,求FnmodMF_n\text{ }mod\text{ }M
資料保證3+Fn

1Fn2\sqrt{3+F_{n-1}F_{n-2}}總是整數。

【輸入格式】

從檔案b.infib.in中讀入資料。
一行四個整數F0,F1,M,nF_0,F_1,M,n

【輸出格式】

輸出到檔案b.outfib.out中。
一行一個整數,表示FnF_nMM取模後的值。

【樣例輸入1】

1 1 10 5

【樣例輸出1】

4

【樣例解釋1】

F0=1F_0 = 1
F1=1F_1 = 1
F2=1+1+23+1×1=6F_2 = 1 + 1 + 2 \sqrt {3 + 1 × 1} = 6

2=1+1+23+1×1=6
F3=6+1+23+6×1=13F_3 = 6 + 1 + 2\sqrt{3 + 6 × 1} = 13
F4=13+6+23+13×6=37F_4 = 13 + 6 + 2\sqrt{3 + 13 × 6 }= 37
F5=37+13+23+37×13=94F_5 = 37 + 13 + 2\sqrt{3 + 37 × 13} = 94

【樣例輸入2】

2 3 100 6

【樣例輸出2】

82

【資料規模】

對於30%的資料,nn ≤ 20。
對於60%的資料,F

0=F1=1F_0 = F_1 = 1
對於80%的資料,n105n ≤ 10^5
對於100%的資料,0n1090 ≤ n ≤ 10^91M1091 ≤ M ≤ 10^91F0F11061 ≤ F_0 ≤ F_1 ≤ 10^6

解析:

看到以為不是線性遞推,整個人就方了。

然而聽到有dalao說是二次剩餘,貌似並沒有AA掉此題。

思路:

由上面的遞推式我們有結論3+FnFn1=3+Fn1Fn2+Fn1\sqrt{3+F_nF_{n-1}}=\sqrt{3+F_{n-1}F_{n-2}}+F_{n-1}

直接構造矩陣,快速冪推一下就行了。

程式碼:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const

inline
ll getint(){
	re ll num;
	re char c;
	while(!isdigit(c=gc()));num=c^48;
	while(isdigit(c=gc()))num=(num<<1)+(num<<3)+(c^48);
	return num;
}

ll mod;
ll n,F1,F0;

struct matrix{
	ll a[3][3];
	matrix(){memset(a,0,sizeof a);}
	
	void origin(){
		a[0][0]=1,a[0][1]=0,a[0][2]=0;
		a[1][0]=0,a[1][1]=1,a[1][2]=0;
		a[2][0]=0,a[2][1]=0,a[2][2]=1;
	}
	
	void init(){
		a[0][0]=1,a[0][1]=1,a[0][2]=1;
		a[1][0]=1,a[1][1]=0,a[1][2]=0;
		a[2][0]=2,a[2][1]=0,a[2][2]=1;
	}
	
	ll *const operator[](cs int &offset){
		return a[offset];
	}
	
	friend matrix operator*(matrix t,matrix b){
		matrix c;
		(c[0][0]=t[0][0]*b[0][0]%mod+t[0][1]*b[1][0]%mod+t[0][2]*b[2][0]%mod)%=mod;
		(c[0][1]=t[0][0]*b[0][1]%mod+t[0][1]*b[1][1]%mod+t[0][2]*b[2][1]%mod)%=mod;
		(c[0][2]=t[0][0]*b[0][2]%mod+t[0][1]*b[1][2]%mod+t[0][2]*b[2][2]%mod)%=mod;
		(c[1][0]=t[1][0]*b[0][0]%mod+t[1][1]*b[1][0]%mod+t[1][2]*b[2][0]%mod)%=mod;
		(c[1][1]=t[1][0]*b[0][1]%mod+t[1][1]*b[1][1]%mod+t[1][2]*b[2][1]%mod)%=mod;
		(c[1][2]=t[1][0]*b[0][2]%mod+t[1][1]*b[1][2]%mod+t[1][2]*b[2][2]%mod)%=mod;
		(c[2][0]=t[2][0]*b[0][0]%mod+t[2][1]*b[1][0]%mod+t[2][2]*b[2][0]%mod)%=mod;
		(c[2][1]=t[2][0]*b[0][1]%mod+t[2][1]*b[1][1]%mod+t[2][2]*b[2][1]%mod)%=mod;
		(c[2][2]
            
           

相關推薦

2018.09.27BZOJ5221偏題矩陣快速數學推理

【問題描述】 斐波那契數列是一個經典遞推數列,即Fibn=Fibn−1+Fibn−2Fib_n=Fib_{n-1}+Fib_{n-2}Fibn​=Fibn−1​+Fibn−2​ 在這個問題中,定義一個新數列,對於n≥2n ≥ 2n≥2有Fn=Fn−1+Fn−2+

2018.09.27BZOJ1076洛谷P4273SCOI2008獎勵關狀壓DP期望DP

洛谷傳送門 解析: 一眼看題面就是期望DP,再看資料範圍就知道是狀態壓縮 思路: 一般來說是期望倒著推,概率順著推,少數情況可以不遵守以上規則。 然而這個就顯然不是少數情況,我們仍然選擇倒推。 我們考慮什麼狀態能夠倒著轉移回來。 我們列舉下一輪丟出的寶物,看

HDU1005Number Sequence(矩陣快速)

記錄一個菜逼的成長。。 題目連結 題目大意: f[1] = 1,f[2] = 1,f[n] = (a*f[n-1]+b*f[n-2])%7(n > 2) 給你a,b。求f[n]。

HDU 4549 M斐波那契數列 矩陣快速+費馬小定理

思路: 通過列出幾項我們就可以發現ab的指數是斐波那契數列。然後博主就開(智)心(障)的用矩陣快速冪算指數了。。 卻忘了一件事。。。誰說的取模對指數封閉的啊???md瘋狂wa了六七次。 取模對乘法

HDU 4549 M斐波那契數列 矩陣快速 + 費馬小定理

M斐波那契數列F[n]是一種整數數列,它的定義如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 現在給出a, b, n,你能求出F[n]的值嗎? Input 輸入包含多組測試資料; 每組資料佔一行,包含3個

HDU 4549 M斐波那契數列矩陣快速+費馬小定理

M斐波那契數列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 3476    Accepted Submi

HDU 4549 M斐波那契數列矩陣快速+費馬小定理

這道題以為是很水的矩陣快速冪,把矩陣{1,1,1,0}進行快速冪乘遞推,ans[0][0]為a的指數,ans[0][1]為b的指數,但是瘋狂wa,百度搜題解發現用到了費馬小定理,A^X = A^( X mod phi(M) ) ( mod M ),又因為M為質數,所以ph

2018.09.22JSOI2008BZOJ1016最小生成樹計數矩陣樹定理並查集

傳送門 解析: 好的這是一道需要數學推理的矩陣樹題目。 首先我們考慮一個問題。 前置定理 我們先隨便做一棵最小生成樹。 重要定理:那麼在這棵生成樹中如果權值為www的邊有ttt條,那麼在所有最小生成樹中,權值為www的邊都有kkk條。 證明如下: 考慮在這棵

2018.09.26TJOI2017BZOJ4888洛谷P3760異或和樹狀陣列差分

洛谷傳送門 解析: 額,TJOITJOITJOI連續兩年考了位運算。。。 我還能說什麼。。。 PS:zxyoiPS:zxyoiPS:zxyoi不是天津oieroieroier。 思路: 一般位運算都

2018.09.26BZOJ4260Codechef REBXOR01Trie

傳送門 解析: 這種要求分成兩段的問題,一般就是處理出一個字首最大和一個字尾最大。 然後O(n)O(n)O(n)掃一遍就好了。 那麼,怎麼求? 這種異或問題當然還是要01Trie01Trie01Tri

2018.09.26BZOJ4602洛谷P4079SDOI2016齒輪搜尋圖的遍歷

洛谷傳送門 解析: 這道題O(V+E)O(V+E)O(V+E)就過了啊。。。 然而官方標解是並查集。。。 我。。。 思路: 只要按照圖的遍歷一邊跑一遍驗證就行了。 DFSDFSDFS比較好寫。 程

2018.09.29洛谷P2106Sam數數位DP矩陣快速

傳送門 解析: 其實這種只用位數轉移的數位DPDPDP,大概都可以用矩陣快速冪推。本質原因是每層的轉移方程與這是第幾層無關,比如這道題。 思路: 可以發現一個很顯然的情況,就是上面說的,這道題可以矩陣

2018.09.30LOJ517「LibreOJ β Round #2」計算幾何瞎暴力01Trie二進位制拆分

傳送門 解析: 看到標題的dalaodalaodalao先不要急著錘我。。。 這道題的二進位制拆分和01Trie01Trie01Trie不能混在一起,不要急著說01Trie01Trie01Trie就是二進位制拆分。。。 思路: 這道題可以說是非常好的一道資料結

2018.09.30POJ3348Cows凸包三角剖分

傳送門 解析: 讀優沒有寫負數又被卡了半個小時。。。 這裡採用JarrisJarrisJarris步進法求凸包。。主要講一講怎麼求多邊形面積。 思路: 滿足題意的顯然是這些點的凸包,而我們要做的就是求出凸包面積。 那麼怎麼求多邊形面積? 考慮三角剖分,我們將多

2018.09.29BZOJ1026洛谷P2657SCOI2009windy數數位DP

洛谷傳送門 解析: 由於資料範圍很小(相對於大部分數位DPDPDP題來說)。 我們只記錄當前位,當前位數字,是否是前導0,是否達到上界。 簡單DP記憶化搜尋一下就好了。 程式碼: #include

2018.09.28Vijos1053Easy ssspSPFA判負環

傳送門 解析: 深入理解SPFASPFASPFA的本質。 思路: 由於是佇列優化的Bellman−FordBellman-FordBellman−Ford,SPFASPFASPFA也具有判負環的功能,

2018.09.29HDU2089不要62數位DP

傳送門 解析: 今天突然發現自己還沒寫過數位DPDPDP入門題。。。 思路: 我們從高位向低位DP,採用記憶化搜尋。 初始化fff陣列為−1-1−1,因為我們可能DPDPDP到某個狀態是沒有合法數的。

2018.09.28BZOJ4318OSU!期望DP

傳送門 解析: 不錯的期望DP入門題。 思路: 首先,要是沒有明白期望的線性性。這道題是無法理解的。 一個常識,要維護高次,我們可以將高次展開,利用低次來維護。 所以我們同時維護長度的期望,長度平方的期望,長度立方的期望。 注意這裡可能就有人不懂了,長度平方的

2018.09.18BZOJ4517SDOI2016排列計數組合數學錯排問題

Description 求有多少種長度為 n 的序列 A,滿足以下條件: 1 ~ n 這 n 個數在序列中各出現了一次 若第 i 個數 A[i] 的值為 i,則稱 i 是穩定的。序列恰好有 m 個數是穩定的 滿足條件的序列可能很多,序列數對 10^9+7 取模。

2018.11.08CodeForces989E. A Trance of Nightfall矩陣快速倍增

傳送門 解析: 考場上本來想寫倍增來著結果發現這個東西可以矩陣快速冪轉移,所以倍增陣列就用來優化矩陣快速冪了。。。(省去每次求出轉移矩陣的一個 O