1 条题解
-
0
题意分析
是满足 的整数。可以证明,对于任意整数 ,都有 。现在,对于给定的整数 ,我们需要编写一个程序计算并输出 。
需要注意的是,直接递归实现上述递推关系可能会导致程序在 较大时无法终止,因此需要采用更高效的算法。
解题思路
直接递归的问题 如果直接按照递推公式递归计算,对于较大的(例如 ),递归调用的层数会非常多,导致程序运行时间过长甚至栈溢出。因此,直接递归的方法不可行。
动态规划优化 为了高效计算 ,可以采用动态规划(, )的方法。动态规划的核心思想是将子问题的解存储起来,避免重复计算。
具体步骤: 初始化:首先,我们初始化 到 的值分别为 。 递推计算:对于 ,我们通过递推公式计算 ,并将结果存储在数组中。 取模运算:由于结果需要对 取模,我们在每次计算后都进行取模操作,以确保结果在 到 之间。 公式表示: 对于,递推公式为:
$Φ(i)=(Φ(i−1)+Φ(i−2)−Φ(i−3)+Φ(i−4)−Φ(i−5)+Φ(i−6)−Φ(i−7)+Φ(i−8))mod1000$
标程
#include <iostream> #include <math.h> #include <string.h> using namespace std; int a, b, c, d, e, f, g, h, i; int ans[1001]; int mod(int a, int b) { int r; for (r = 0; r <= b - 1; r++) if ((a - r) % b == 0) return r; } int solve(int n) { // 顺推过去 for (int k = 3; k <= n; k++) { if (k % 2 == 1) { int t = d * ans[k - 1] + e * ans[k - 2] - f * ans[k - 3]; ans[k] = mod(t, g); } else { int t = f * ans[k - 1] - d * ans[k - 2] + e * ans[k - 3]; ans[k] = mod(t, h); } } return 0; // 函数需要有返回值,这里返回0表示正常结束 } int solve1(int n) { // 递归思路 if (ans[n] > -1) return ans[n]; else if (n % 2 == 1) { int t = d * solve1(n - 1) + e * solve1(n - 2) - f * solve1(n - 3); ans[n] = mod(t, g); return ans[n]; } else { int t = f * solve1(n - 1) - d * solve1(n - 2) + e * solve1(n - 3); ans[n] = mod(t, h); return ans[n]; } } int main(void) { int t; cin >> t; while (t--) { // 手动将ans数组初始化为-1 for (int j = 0; j < 1001; ++j) { ans[j] = -1; } cin >> a >> b >> c >> d >> e >> f >> g >> h >> i; ans[0] = a; ans[1] = b; ans[2] = c; solve1(i); cout << ans[i] << endl; } return 0; }
- 1
信息
- ID
- 1696
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者