bzoj 1002 轮状病毒

终于把这个坑填了。
开开心心的敲完了矩阵树,一交,wa了。翻hzwer题解,发现是矩阵树找规律+高精度。这个数据范围好骗人啊。于是乎我就写了今年第一道高精度。 f[i]=f[i-1]*3-f[i-1]+2,可以设出一个f[i]=af[i-1]+bf[i-2]+cf[i-3]+d,解出来系数。
 
   

#include
#include
#include
#include
#include

#define md
#define ll long long
#define inf (int) 1e9
#define eps 1e-8
#define N 110
using namespace std;
struct data{ int a[N],len;} f[N];
data operator * (data a,int b)
{
for (int i=1;i<=a.len;i++) a.a[i]*=b;
for (int i=1;i<=a.len;i++)
{
if (a.a[i]>=10)
{
a.a[i+1]+=a.a[i]/10;
a.a[i]%=10;
}
}
while (a.a[a.len+1]) a.len++;
return a;
}
void solve(int i)
{
f[i]=f[i-1]*3;
//for (int j=f[i].len;j;j--) printf("%d",f[i].a[j]); printf("\n");
for (int j=1;j<=f[i].len;j++)
{
f[i].a[j]-=f[i-2].a[j ];
while (f[i].a[j]<0) { f[i].a[j]+=10; f[i].a[j+1]--; }
}
while (!f[i].a[f[i].len]) f[i].len--;
//for (int j=f[i].len;j;j--) printf("%d",f[i].a[j]); printf("\n");
f[i].a[1]+=2;
int j=1;
while (f[i].a[j]>=10)
{
f[i].a[j+1]+=f[i].a[j]/10;
f[i].a[j]%=10;
j++;
}
while (f[i].a[f[i].len+1]) f[i].len++;
//for (int j=f[i].len;j;j--) printf("%d",f[i].a[j]); printf("\n");
//printf("finish solve %d\n",i);
}

int main()
{
int n;
scanf("%d",&n);
f[1].a[1]=1; f[1].len=1;
f[2].a[1]=5; f[2].len=1;
for (int i=3;i<=n;i++) solve(i);
for (int i=f[n].len;i;i--) printf("%d",f[n].a[i]); printf("\n");
return 0;
}


你可能感兴趣的:(数论)