1. 程式人生 > >Luogu P2144 [FJOI2007]輪狀病毒

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); //} //} }

註釋掉的程式碼都是除錯的曲折,看來高精度還沒有熟練掌握啊。。。