题目原链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2085
分析:
额额。。。应该没啥好讲的,注意点就是先离线计算,也就是先打表。还有一个注意点就是要用long long,因为用int存会不够,会发现n>=30会不正常答案出现负,说明超过范围了,所以改用long long。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
long long highNum[40],lowNum[40];
void init()
{
highNum[0] = 1;
lowNum[0] = 0;
for(int i = 1;i <= 33;i++)
{
highNum[i] += (highNum[i-1]*3+lowNum[i-1]*2);
lowNum[i] += (highNum[i-1]+lowNum[i-1]);
}
}
int main()
{
init();
int n;
while(1)
{
scanf("%d",&n);
if(n==-1)
break;
printf("%lld, %lld\n",highNum[n],lowNum[n]);
}
return 0;
}