求下式的值:sn
=⌈(a
+b√)
n⌉%m
其中:0
m<215
0n<231
(a−1)
2<
b令:a
n=(a
+b√)
n b
n=(a
−b√)
n c
n=an
+bn
因為:(a
−1)2
<
b所以:0
b√<1
所以:0<(a
−b√)
n<1
即: bn
<1
也就是說,cn
=⌈an
⌉ ,sn
=cn
因此,求cn
就行了。cn
兩邊同時乘以a1
+b1 :cn
∗[(a
+b√)
+(a−
b√)]
=[(a+b
√)n+
(a−b
√)n]
∗[(a
+b√)
+(a−
b√)]
=(a+b√
)n+1
+(a−
b√)n
+1+(
a+b√
)n∗(
a−b√
)+(a
−b√)
n∗(a
+b√)
=cn+1+
(a2−
b)∗(
a+b√
)n−1
+(a2
−b)∗
(a−b
√)n−
1 =
cn+1
+(a2
−b)∗
cn−1
所以:cn+
1=2∗
a∗cn
−(a2
−b)∗
cn−1
寫成矩陣形式:[c
n+1c
n]=[
2∗a1
−(a2
−b)0
]∗[c
1c0]
至此,公式推導完畢,用快速冪求解就行了。
#pragma comment(linker, "/stack:1677721600")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pb push_back
#define mp make_pair
#define ll long long
#define lson lo,mi,rt<<1
#define rson mi+1,hi,rt<<1|1
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define mem(a,b) memset(a,b,sizeof(a))
#define fin freopen("in.txt", "r", stdin)
#define fout freopen("out.txt", "w", stdout)
using
namespace
std;
const
double eps = 1e-8;
const
double ee = exp(1.0);
const
int inf = 0x3f3f3f3f;
const
int maxn = 1e3 + 10;
const
double pi = acos(-1.0);
const ll iinf = 0x3f3f3f3f3f3f3f3f;
int readt()
int mod;
typedef
vector
vec;
typedef
vector
mat;
mat mul(mat &a, mat &b)}}
return c;
}mat pow(mat a, ll n)
while (0
< n)
return b;
}int main()
return
0;}
HDU 4565 矩陣快速冪
矩陣快速冪模板 用矩陣快速冪實現斐波拉希數的推導 這個矩陣自乘n次。連續自乘n次的話就沒意思了,那還不如直接上fibonacci遞推公式呢。矩陣的魅力就在於它可以上快速冪。因為矩陣乘法滿足結合律麼 注意取模 加m因為有mod負 include include include include defi...
hdu4565矩陣快速冪
這題太坑了。剛開始以為可以用 a sqrt b 1 水過。結果tle,還一直想明明我logn的做法怎麼可能tle。0 1 實在無奈看的題解 a sqrt b n x y sqrt b a sqrt b n 1 a x b y x a y sqrt b 這樣可以構造矩陣 a b x 1 b y 還有記...
hdu 4565 公式推導 矩陣快速冪
參考 這公式真心難想到 向上取整等價於加上後面乙個式子,學習了orz。寫完快速冪,我還一直wa,最後才發現中途計算的時候沒有 a mod mod,因為會變成負數,坑啊。include include include include using namespace std define mn 2 de...