Luogu P2144 [FJOI2007]輪狀病毒
阿新 • • 發佈:2019-02-15
第一遍看完生澀的題目,發現:肯定是數論
數論。。。不可以一看就慫 應該看第二遍再慫
開始在畫圖中愉快的模擬,然後我發現我畫出的圖形又醜又無法保證正確性。。。
感到自己很傻並停止了這樣的行為。。。
%一篇很棒的題解
根據其中推薦,發現了一個很有趣很有用的網站
我和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);
//}
//}
}
註釋掉的程式碼都是除錯的曲折,看來高精度還沒有熟練掌握啊。。。