题目
源地址:
http://poj.org/problem?id=3048
理解
数学规律并不难,很容易推出f[n]=f[n-1]+f[n-2]*2。但是2^1000次方,必须使用一定的手段来处理这个超大的数据。这里使用了一种比较简单的技巧,数组模拟。
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int dig[1010][1010];
int main(int argc, char const *argv[])
{
dig[1][0] = 0;
dig[2][0] = 1;
for (int i = 3; i <= 1000; i++)
{
for (int j = 0; j < 1000; j++)
{
dig[i][j] += dig[i - 2][j] * 2 + dig[i - 1][j];
if (dig[i][j] > 9)
{
dig[i][j + 1] = dig[i][j] / 10;
dig[i][j] %= 10;
}
}
}
int n;
while ( cin >> n)
{
if ( n == 1) cout << "0" << endl;
else
{
bool flag = true;
for (int i = 999; i >= 0; i--)
{
if ( dig[n][i] && flag)
{
flag = false;
}
if (!flag)
cout << dig[n][i] ;
}
cout << endl;
}
}
return 0;
}
更新日志
- 2014年07月15日 已AC。