您的位置:首页 > 其它

bzoj1002[FJOI2007]轮状病毒

2014-06-01 23:21 253 查看

给定n(N<=100),编程计算有多少个不同的n轮状病毒。

Input

第一行有1个正整数n。

Output

将编程计算出的不同的n轮状病毒数输出

Sample Input

3

Sample Output

16

神dp。如果没看题解真心想不出来

#include<stdio.h>
#include<string.h>
#define MAXD 110
int N;
struct BigInteger
{
char a[MAXD];
const static int D = 100;
void init(int n)
{
int i;
for(i = 0; i < D; i ++)
{
a[i] = n % 10;
n /= 10;
}
}
BigInteger add(BigInteger &b)
{
int i, s, c;
BigInteger ans;
c = 0;
for(i = 0; i < D; i ++)
{
s = a[i] + b.a[i] + c;
ans.a[i] = s % 10;
c = s / 10;
}
return ans;
}
BigInteger minus(BigInteger &b)
{
int i, s, c;
BigInteger ans;
c = 0;
for(i = 0; i < D; i ++)
{
s = a[i] + c;
if(s >= b.a[i])
{
ans.a[i] = s - b.a[i];
c = 0;
}
else
{
c = -1;
ans.a[i] = s + 10 - b.a[i];
}
}
return ans;
}
void print()
{
int i;
for(i = D - 1; i > 0 && a[i] == 0; i --);
for(; i >= 0; i --)
printf("%d", a[i]);
}
}f[MAXD], h[MAXD], g[MAXD];
void init()
{
f[1].init(0), g[1].init(1), h[1].init(1);
f[2].init(3), g[2].init(2), h[2].init(3);
}
void solve()
{
int i;
for(i = 3; i <= N; i ++)
{
f[i] = f[i - 1].add(f[i - 1]).add(h[i - 1]).minus(h[i - 2]);
g[i] = f[i - 1].add(g[i - 1]).add(h[i - 1]);
h[i] = f[i - 1].add(h[i - 1]).add(h[i - 1]).minus(h[i - 2]);
}
f
.add(g
).print();
printf("\n");
}
int main()
{
while(scanf("%d", &N) == 1)
{
init();
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: