题目链接:https://nanti.jisuanke.com/t/A2022
题解:因为第1 2 天吃的啥,可以确定出第三天的,所以我们可以得到可以由 12天的 推得 23 天的,因此这样就可以构造一个9*9的矩阵了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
struct node {
ll mat[9][9];
};
node ans, a;
ll n;
int O[9][9]= {
0, 1, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 1,
1, 1, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 0
};
void init() {
for(int i = 0; i < 9; i++)
for(int j = 0; j < 9; j++) {
if(i == j) ans.mat[i][j] = 1;
else ans.mat[i][j] = 0;
a.mat[i][j] = O[i][j];
}
}
node cul (node x, node y) {
node z;
for(int i = 0; i < 9; i++) {
for(int j = 0; j < 9; j++) {
z.mat[i][j] = 0;
for(int k = 0; k < 9; k++) {
z.mat[i][j] = (z.mat[i][j] + x.mat[i][k] * y.mat[k][j]) % mod;
}
}
}
return z;
}
void solve(ll y) {
while(y) {
if(y & 1) ans = cul(ans, a);
y >>= 1;
a = cul(a, a);
}
ll res = 0;
for(int i = 0; i < 9; i++)
for(int j = 0; j < 9; j++)
res = (res + ans.mat[i][j]) % mod;
printf("%lld\n", res);
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%lld", &n);
if(n == 1) printf("3\n");
else if(n == 2) printf("9\n");
else {
init();
solve(n - 2);
}
}
return 0;
}
本文介绍了一种使用矩阵快速幂算法解决特定食物组合问题的方法。通过构建9x9矩阵,利用快速幂技巧,有效地计算了从第12天到第23天的食物组合可能性。代码中详细展示了矩阵初始化、快速幂运算及最终结果输出的过程。
1万+

被折叠的 条评论
为什么被折叠?



