2020牛客寒假集訓第一場J題 矩陣快速冪

2021-10-02 15:36:06 字數 3171 閱讀 9496

給你5個數 :n,x,y,a,b(1<=n,x,y,z,b<=1e12)

f(1)=x,f(2)=y,f(i)=f(i-1)*f(i-2)*a^b(i>3)

讓你求f(n)%1e9+7的值

f(1)=x;

f(2)=y;

f(3)=x*y*a^b;

f(4)=x*y*a^b*y*a^b=x*y^2*a^2b

f(5)=x*y^2*a^2b*x*y*a^b*a^b=x^2*y^3*a^4b

f(6)=x^2*y^3*a^4b*x*y^2*a^2b=x^3*y^5*a^6b

設c為常數

c      x      y

1   0      1      0

2   0      0      1

3   1      1      1

4   2      1      2

5   4      2      3

6   6      3      5

c:i<3:fb2(1)=fb2(2)=0;

i>=3:fb2(i)=fb2(i-1)+fb2(i-1)+1;

//注意不能化成fb2(i)=fb2(i-1)*fb2(i-2)*a^b;

//因為這樣不能用常量矩陣來維護,因為矩陣乘法的每一項的結果是相加的。

ans1=a^(b*fb2(i)),相當於只維護冪次和

1 1 1     fb2(i-1)       fb2(i)

1 0 0 *  fb2(i-2)  =   fb2(i-1)

0 0 1    1                 1

設t為3*3的矩陣,,};

設ai為3*1的矩陣

則a1=

ai=a(i-1)*t

a2=a1*t

a3=a2*t=a1*t^2

=>ai=a1*t^(i-1)

=>        

fb2(2)        fb2(i)

t^(i-1) *  fb2(1)  =    fb2(i-1)

1                1

如果要求fb2(n) 

利用矩陣快速冪求出t^(n-1)

fb2(n)=t^(n-1)的第一行*a1的第一列(即矩陣)

則c對答案的貢獻為 ans1=a^(b*fb2(n))(可以用快速冪求)

x:i<3:fb1(1)=1, fb1(2)=0;

i>=3:fb1(i)=fb1(i-1)+fb1(i-2);

1 1     fb1(i-1)     fb1(i)

1 0  *  fb1(i-2)  =  fb1(i-1)

設t為2*2的矩陣,}

設ai為2*1的矩陣

則a1為2*1的矩陣

ai=a(i-1)*t; 

a2=a1*t

a3=a2*t=a1*t*t=a1*t^2

a4=a3*t=a1*t*t*t=a*t^3;

根據遞推式可得

ai=a1*t^(i-1);

即   

t^(i-1)      fb1(2)      fb1(i)

*   fb1(1)  =  fb1(i-1).

故fb1(n)=t^(n-1)的第一行*a1(即矩陣) 

因此對答案的貢獻是 ans2=x^fb1(n);

y:i<3:fb1(1)=0,fb1(2)=1;

i>=3:fb1(i)=fb1(i-1)+fb1(i-2);

推導過程和上面類似,只不過初始值變了

可以自己再推一遍。

最後答案就是ans1*ans2%mod*ans3%mod

trick:

1.因為x和y的遞推都是斐波那契數列,只不過初始值變了,而且x比y多了一位,所以我們可以放在一起考慮。

2.a^b對上面的指數取模時不能直接取,需要用到費馬小定理

定理內容:如果p是乙個質數,而整數a不是p的倍數,則有a^(p-1)≡1(mod p)

3.根據上面的定理所以我們需要特判a是p的倍數的情況以及x,y是p的倍數的情況。

#pragma gcc optimize(2)

#include#include#include#include#include#include#include#include#include#include#include#define pi atan(1.0)*4

#define e 2.718281828

#define rp(i,s,t) for (register int i = (s); i <= (t); i++)

#define rp(i,t,s) for (register int i = (t); i >= (s); i--)

#define ll long long

#define ull unsigned long long

#define mst(a,b) memset(a,b,sizeof(a))

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define pii pair#define mp make_pair

#define pb push_back

using namespace std;

inline int read()

while(c>='0'&&c<='9')

return a*b;

}ll n,x,y,a,b;

const int inf = 0x3f3f3f3f;

const ll mod = 1e9+7;

struct matrix;

matrix mul(matrix a,matrix b, ll m)

}return res;

}matrix matrix_pow(matrix a,ll b,ll m)

return res;

}ll fb1(int flag,ll n,ll m)

ll fb2(ll n,ll m)

ll quick_pow(ll a,ll b,ll m)

return res%m;

}int main()

}return 0;

}

2020牛客多校第一場 A題

題意 給乙個字串,求出按函式的方法得到的b,b的所有以pi為起點的字尾按字典序排序。得到pi的序列。思路 找字尾陣列c 找到第i個後面與它相同字元的距離 可以證明b陣列與c陣列對應的字尾字典序是相反的。求c陣列的時候有些操作也在下面位址裡。上面兩個的位址 大佬位址 找出每個字尾陣列後,排序就可以了,...

2020牛客寒假演算法基礎集訓營第一場(補題)

題目描述 hanayo很喜歡吃公尺飯。有一天,她拿出了 個碗,第乙個碗裝了 粒公尺飯,第二個碗裝了 粒公尺飯,以此類推,第 個碗裝了 粒公尺飯。然而,愛搞惡作劇的rin把所有的碗的順序打亂,並拿走了乙個碗。hanayo想知道,rin拿走的碗裡有多少粒公尺飯?輸入描述 第一行輸入乙個正整數 代表原始的...

牛客寒假多校第一場A

題目描述 在絕地求生 吃雞 遊戲裡,不同的槍枝有不同的威力,更是可以搭配不同的配件,以提公升槍枝的效能。每一把槍都有其威力及其可裝備配件種類。每乙個配件有其所屬種類,可以為槍枝提供威力的百分比加成。每一把槍只能裝備乙個同類配件。給你n把槍枝和m個配件,槍的威力為p,可裝備的配件數量為k,為k個不同型...