蛋蛋接到了一个布置会场的任务。他需要将贵宾观众席的椅子排成一排,一共需要N个。上级领导指示,他只能使用两种椅子。(A类型和B类型)并且假设每种椅子的数量都是无限的。摆放规则是这样的:若摆放A类型的椅子,每次可以摆放一个,若摆放B类型椅子,每次必须摆放两个。蛋蛋突然想知道对应N个椅子排成一列,他能够有多少种布置的方式
好久没写快速幂矩阵了, 写的时候出现了一个两个很智障的地方。 递推公式 f(n) = f( n - 1) + f ( n - 2);
#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long
#define mod 1000000007
using namespace std;
const int mx = 1e5 + 10;
struct maze{
ll m[2][2];
};
maze mul(maze a, maze b){
maze te;
for(int i = 0; i < 2; i++){
for(int j = 0; j < 2; j++){
te.m[i][j] = 0;
for(int k = 0; k < 2; k++){
te.m[i][j] += a.m[i][k] * b.m[k][j]; //这里顺序写错了 智障
te.m[i][j] %= mod;
}
}
}
return te;
}
void power(ll n){
maze base={1, 1, 0, 0}, ans={1, 1, 1, 0};
while(n > 0){
if(n % 2){
base = mul(base , ans);
}
n /= 2;
ans = mul(ans , ans); //竟然写 ans = (ans, ans ) 智障
}
cout<<base.m[0][1]<<endl;
}
int main(){
int t;
ll n;
scanf("%d", &t);
while(t--){
scanf("%lld", &n);
power(n);
}
return 0;
}