【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度

时间:2023-03-08 22:12:39

Description

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

【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度

Input

第一行有1个正整数n。

Output

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

Sample Input

3

Sample Output

16

HINT

Source

Solution:推导不会,看不懂,知道了公式f[i]=f[i-1]*3-f[i-2]+2;要加高精度然后水过,可以打表找规律,不太会打。。。找规律,VFK的推导清晰全过程

 #include <iostream>
#include <cstdio>
using namespace std;
struct data{int a[],len;}f[];
int n;
data gjc(data a,int k)
{
for (int i=;i<=a.len;i++) a.a[i]*=k;
for (int i=;i<=a.len;i++)
{
a.a[i+]+=a.a[i]/;
a.a[i]%=;
}
if (a.a[a.len+]!=) a.len++;
return a;
} data gjj(data a,data b)
{
a.a[]+=;
int j=;
while (a.a[j]>=)
{
a.a[j]%=;
a.a[j+]++;
j++;
}
if (a.a[a.len+]!=) a.len++;
for (int i=;i<=a.len;i++)
{
a.a[i]-=b.a[i];
if (a.a[i]<) {a.a[i]+=; a.a[i+]--;}
}
while (a.a[a.len]==) a.len--;
return a;
} int main()
{
scanf("%d",&n);
f[].a[]=;f[].a[]=;
f[].len=f[].len=;
for (int i=;i<=n;i++)
f[i]=gjj(gjc(f[i-],),f[i-]);
for (int i=f[n].len;i>;i--)
printf("%d",f[n].a[i]);
return ;
}