bzoj 1002 找规律,高精度

1002: [FJOI2007]轮状病毒

,问有多少种情况。

tags:看了题解,f[i]=f[i-1]*3-f[i-2]+2。 有基尔霍夫矩阵推的,也有dp推的,还有写爆搜算出前几个找规律的,

然而,本弱鸡连个爆搜都写不出来,23333

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,b,a) for (int i=b;i>=a;i--)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long ll;
const int N = 200;

int n;
struct P { int a[N], len; }f[N];
P sub(P b, P c)
{
    b.a[1]+=2;
    int j=1;
    while(b.a[j]>9) b.a[j+1]+=b.a[j]/10, b.a[j]%=10, j++;
    rep(i,1,b.len) {
        b.a[i]-=c.a[i];
        if(b.a[i]<0) b.a[i]+=10, b.a[i+1]--;
    }
    while(b.len>1 && b.a[b.len]==0) b.len--;
    return b;
}
P mul(P b, int x)
{
    rep(i,1,b.len) b.a[i]*=x;    
    rep(i,1,b.len) {
        //b.a[i]*=x;      //很sb地在这里卡了个bug
        b.a[i+1]+=b.a[i]/10;
        b.a[i]%=10;
    }
    if(b.a[b.len+1]) b.len++;
    return b;
}
void Init()
{
    f[1].len=f[2].len=1;
    f[1].a[1]=1, f[2].a[1]=5;
    rep(i,3,N-1) f[i]=sub(mul(f[i-1], 3), f[i-2]);
}
int main()
{
    Init();
    scanf("%d", &n);
    per(i,f[n].len,1) printf("%d", f[n].a[i]);
    puts("");

    return 0;
}
View Code
posted @ 2017-03-01 23:24  v9fly  阅读(273)  评论(0编辑  收藏  举报