P1939 矩陣加速(距陣快速冪)

2021-10-07 10:38:49 字數 1835 閱讀 8182

思路:這個資料範圍,想要硬算是不可能的。所以我們需要用距陣快速冪去加速這個遞推。我們可以構造乙個距陣:

然後我們發現,

f[ i ]=f[i-1] * 1+ f[i-2] * 0 + f[i-3] * 1;

f[i-1]=f[i-1] * 1 + f[i-2] * 1 + f[i-3] * 0;

f[i-2]=f[i-1] * 0 + f[i-2] * 1 + f[i-3] * 0;

這樣我們就可以構造出遞推距陣:

構造方法多樣,不唯一

最後上模板就行了。

#include

#define endl '\n'

#define null null

#define ls p<<1

#define rs p<<1|1

#define fi first

#define se second

#define mp make_pair

#define pb push_back

#define ll long long

#define int long long

#define pii pair

#define ull unsigned long long

#define all(x) x.begin(),x.end()

#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

#define ct cerr<

char

*fs,

*ft,buf[

1<<20]

;#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;

inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}using

namespace std;

const

int n=

1e5+5;

const

int inf=

0x3f3f3f3f

;const

int mod=

1e9+7;

const

double eps=

1e-7

;const

double pi=

acos(-

1);struct node

;node mul

(node a,node b)}}

return c;

}int

qpow

(int b)

return res.v[1]

[1];

}signed

main()

}

P1939 矩陣加速(數列)

這個題若不看題目和範圍,我首先想到用遞推,不過 n 2 10 9,若用遞推,一定會超時。要用矩陣加速的話首先要找到乙個矩陣 不唯一 用來相乘 a1,a2,a3 是乙個1 3的矩陣,我想把它轉化為 a2,a3,a4 也是乙個1 3的矩陣,所以要找的矩陣肯定是3 3的 可以假設這個3 3的矩陣為 所以 ...

P1939 模板 矩陣加速(數列)

題目描述 a 1 a 2 a 3 1 a x a x 3 a x 1 x 3 求a數列的第n項對1000000007 10 9 7 取餘的值。輸入格式 第一行乙個整數t,表示詢問個數。以下t行,每行乙個正整數n。輸出格式 每行輸出乙個非負整數表示答案。輸入輸出樣例 輸入 1 複製36 810輸出 1...

P1939 模板 矩陣加速(數列)

a 1 a 2 a 3 1 a x a x 3 a x 1 x 3 求a數列的第n項對1000000007 10 9 7 取餘的值。輸入格式 第一行乙個整數t,表示詢問個數。以下t行,每行乙個正整數n。輸出格式 每行輸出乙個非負整數表示答案。輸入樣例 1 368 10輸出樣例 1 4919 對於30...