题目链接:https://www.hpuoj.com/contest/16/problem/J/
单测试点时限: 1.0 秒
内存限制: 512 MB
这是一段 C/C++ 代码,用于计算递推数列 ?? 的。
const int MOD = (int)1e9 + 7; int a(int n) { if(n < 3) return 1; return ((a(n - 1) << 1) % MOD + (a(n - 2) >> 1)) % MOD; }
现在请根据这段代码输出第 ? 项数列的值 ?? 。
输入
第一行一个整数 ?。
之后的 ? 行,每行 1 个整数,表示 ? 。
0<?≤105, 0<?≤106 。
输出
每一行请输出一个 ?? 的值
input
3 1 2 3
output
1 1 2
解题思路:把递归变成非递归,用数组保存就好了。然后预处理一下
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; #define ll long long #define maxn 1000000+10 ll k[maxn]; const int MOD = (int)1e9 + 7; void init() { for (int i =0; i < 3; i++) { k[i] = 1; } for (int i = 3; i < maxn; i++) { k[i] = ((k[i-1]<<1 )%MOD+ (k[i-2]>>1)%MOD)%MOD; } } int main() { init(); ll t,n; cin >> t; while (t--) { cin >> n; printf("%lld\n",k[n]); } return 0; }