1. 程式人生 > >【bzoj1002】輪狀病毒

【bzoj1002】輪狀病毒

using con lin AC 高精度 else n) end for

Portal-->bzoj1002

Solution

  雖然說看上去是一道矩陣樹定理的題但是

  但是!

  沒有模數了解一下,\(n=100\)了解一下

  開心愉快敲了一個高消之後發現跑到\(80\)都已經炸了

  果斷放棄了高消寫高精度的念頭之後突然發現好像這堆矩陣長的都差不多啊

  然後就開始大力打表找規律了。。。

  最後發現其實如果用\(f[x]\)表示\(n=x\)時的答案,那麽我們有:
\[ f[n]=3*f[n-1]-f[n-2]+2 \]
  然後就高精度一下就好了

  就是這麽冷酷無情並且虛偽qwq

  

  代碼大概長這個樣子

#include<iostream>
#include<cstdio> #include<cstring> using namespace std; const int N=110; struct bint{/*{{{*/ int a[N+1]; void set(int val){ memset(a,0,sizeof(a)); a[N]=val; } friend bint operator * (bint x,int y){ bint ret; ret.set(0); int s,g=0; for (int
i=N;i>=1;--i){ s=x.a[i]*y+g; ret.a[i]=s%10; g=s/10; } return ret; } friend bint operator - (bint x,bint y){ bint ret; ret.set(0); int s,g=0; for (int i=N;i>=1;--i){ if (x.a[i]-g-y.a[i]>=0) ret.a[i]=x.a[i]-g-y.a[i],g=0
; else ret.a[i]=x.a[i]+10-g-y.a[i],g=1; } return ret; } friend bint operator + (bint x,bint y){ bint ret; ret.set(0); int s,g=0; for (int i=N;i>=1;--i){ s=x.a[i]+y.a[i]+g; ret.a[i]=s%10; g=s/10; } return ret; } void print(){ int j=1; while (a[j]==0) ++j; for (int i=j;i<=N;++i) printf("%d",a[i]); printf("\n"); } }f[N],two;/*}}}*/ int n; int main(){ #ifndef ONLINE_JUDGE freopen("a.in","r",stdin); #endif scanf("%d",&n); f[1].set(1); f[2].set(5); two.set(2); for (int i=3;i<=n;++i) f[i]=f[i-1]*3-f[i-2]+two; f[n].print(); }

【bzoj1002】輪狀病毒