题目来源于牛客竞赛:https://ac.nowcoder.com/acm/contest/discuss
题目描述:
输入描述:
输出描述:
示例1:
示例2:
示例3:
题解:
代码:
#include <bits/stdc++.h>
using namespace std;
int n, m;
int d[2020];
int a[2020];
int b[2020];
int c[2020];
int f[2020];
int t[1020][1020];
int p = 1000000000;
int pw(int x, int y) {
int re = 1;
for (; y > 0; y >>= 1) {
if (y & 1) {
re = (long long)re * x % p;
}
x = (long long)x * x % p;
}
return re;
}
void mul(int c[], int b[]) {
long long w[3333] = {};
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
w[i + j] = (w[i + j] + (long long)c[i] * b[j]) % p;
}
}
for (int i = 2 * m - 2; i >= m; i--) {
w[i] %= p;
for (int k = 1; k <= m; k++) {
w[i - k] = (w[i - k] + w[i] * a[k]) % p;
}
}
for (int i = 0; i < m; i++) {
c[i] = w[i] % p;
}
}
int main() {
f[0] = 0;
f[1] = 1;
scanf("%d%d", &n, &m);
for (int i = 2; i <= m + 5; i++) {
f[i] = (f[i - 1] + f[i - 2]) % p;
}
for (int i = 0; i <= m + 5; i++) {
t[i][0] = 1;
for (int j = 1; j <= i; j++) {
t[i][j] = ((long long)f[i - j + 1] * t[i - 1][j - 1] + (long long)f[j - 1] * t[i - 1][j]) % p;
}
}
for (int i = 0; i <= m + 5; i++) {
d[i] = pw(f[i], m);
}
for (int i = 1; i <= m + 5; i++) {
d[i] = (d[i] + d[i - 1]) % p;
}
a[1] = 1;
for (int i = 1; i <= m + 1; i++) {
if (i % 4 == 1 || i % 4 == 2) {
a[i] = (a[i] + t[m + 1][i]) % p;
a[i + 1] = (a[i + 1] + p - t[m + 1][i]) % p;
} else {
a[i] = (a[i] + p - t[m + 1][i]) % p;
a[i + 1] = (a[i + 1] + t[m + 1][i]) % p;
}
}
m += 2;
c[0] = 1;
b[1] = 1;
for (; n; mul(b, b)) {
if (n & 1) {
mul(c, b);
}
if (!(n >>= 1)) {
break;
}
}
int ans = 0;
for (int i = 0; i < m; i++) {
ans = (ans + (long long)c[i] * d[i]) % p;
}
printf("%d\n", ans);
return 0;
}
更多问题,更详细题解可关注牛客竞赛区,一个刷题、比赛、分享的社区。
传送门:https://ac.nowcoder.com/acm/contest/discuss