Luogu P2144 [FJOI2007]轮状病毒
第一遍看完生涩的题目,发现:肯定是数论
数论。。。不可以一看就怂 应该看第二遍再怂
开始在画图中愉快的模拟,然后我发现我画出的图形又丑又无法保证正确性。。。
感到自己很傻并停止了这样的行为。。。
%一篇很棒的题解
根据其中推荐,发现了一个很有趣很有用的网站
我和lhy不停按more并且笑了好一会。。。
开始认真看题解,基尔霍夫矩阵及后面都看不懂。。。
于是愉快的选择了
a[i]=a[i-1]*3-a[i-2]+2
然后开始打高精度模拟。。
高精减打错了一个细节还一直没看出来耗了好久。。
#include<cstdio>
#include<cstring>
struct nod1{int a[100100],l;}x[110];
int n;
void chen(int xx)
{
for(int i=1;i<=x[xx].l;i++)
{
x[xx].a[i]=x[xx].a[i]*3;
}
for(int i=1;i<=x[xx].l;i++)
{
if(x[xx].a[i]>9)
{
x[xx].a[i+1]+=x[xx].a[i]/10;
x[xx].a[i]%=10;
if(i+1>x[xx].l)x[xx].l++;
}
}
while(x[xx].l>1&&x[xx].a[x[xx].l]==0)x[xx].l--;
//return z;
}
int jian(int xx,int yy)
{
//nod1 z;
//z.l=xx.l;
for(int i=1;i<=x[xx].l;i++)
{
x[xx].a[i]=x[xx].a[i]-x[yy].a[i];
}
for(int i=1;i<=x[xx].l;i++)
{
if(x[xx].a[i]<0)
{
x[xx].a[i+1]-=1;
x[xx].a[i]+=10;
//if(i+1>z.l)z.l++;
//if(x[xx].a[i+1]==0)x[xx].l--;
}
}
while(x[xx].l>1&&x[xx].a[x[xx].l]==0)x[xx].l--;
}
nod1 work(int xx,int yy,int z)
{
x[z].l=x[xx].l;
for(int i=1;i<=x[xx].l;i++)
{
x[z].a[i]=x[xx].a[i];
}
/*for(int i=x[z].l;i>=1;i--)
{
printf("%d",x[z].a[i]);
}
printf(" %d 1\n",x[z].l);*/
chen(z);
/*for(int i=x[z].l;i>=1;i--)
{
printf("%d",x[z].a[i]);
}
printf(" %d 2\n",x[z].l);*/
jian(z,yy);
x[z].a[1]+=2;
/*for(int i=x[z].l;i>=1;i--)
{
printf("%d",x[z].a[i]);
}
printf("\n");*/
for(int i=1;i<=x[z].l;i++)
{
if(x[z].a[i]>9)
{
x[z].a[i+1]+=x[z].a[i]/10;
x[z].a[i]%=10;
if(i+1>x[z].l)x[z].l++;
}
}
while(x[z].l>1&&x[z].a[x[z].l]==0)x[z].l--;
}
int main()
{
//while(1)
//{
scanf("%d",&n);
//for(int i=1;i<=n;i++)
//{
// x[i].l=0;
//}
x[1].a[1]=1;
x[2].a[1]=5;
x[1].l=1;
x[2].l=1;
for(int i=3;i<=n;i++)
{//printf("11111111");
work(i-1,i-2,i);
}//printf("1111");
/*for(int k=1;k<=15;k++)
{*/
for(int i=x[n].l;i>=1;i--)
{
printf("%d",x[n].a[i]);
}//printf(" %d\n",x[k].l);
//}
//}
}
注释掉的代码都是调试的曲折,看来高精度还没有熟练掌握啊。。。