【bzoj1002】輪狀病毒
阿新 • • 發佈:2018-06-26
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】輪狀病毒