思路:這個資料範圍,想要硬算是不可能的。所以我們需要用距陣快速冪去加速這個遞推。我們可以構造乙個距陣:
然後我們發現,
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...