BZOJ 1002--[FJOI2007]轮状病毒(高精度)

1002: [FJOI2007]轮状病毒

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 6858  Solved: 3745
[Submit][Status][Discuss]

Description

  轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的。一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道。如下图所示

  N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示

  现给定n(N<=100),编程计算有多少个不同的n轮状病毒

 

Input

  第一行有1个正整数n

Output

  计算出的不同的n轮状病毒数输出

Sample Input

3

Sample Output

16

题目链接:

    http://www.lydsy.com/JudgeOnline/problem.php?id=1002 

Solution

  f[i]=(f[i-1]*3-f[i-2]+2)

  然而我也不会推,只会摸鱼。。

代码

#include<iostream>
#include<cstdio>
#define LL long long
using namespace std;
int n;
int b[50],c[50],e[100];
void jia(){
    int tmp=0;
    for(int i=0;i<50;i++){
        e[i]=c[i];
        c[i]=b[i]+c[i]+tmp;
        tmp=0;
        if(c[i]>9){tmp=c[i]/10;c[i]=c[i]%10;}
        b[i]=e[i];
    }
}
void cheng(){
    int tmp=0,f;
    for(int i=0;i<=50;i++)e[i]=0;
    for(int i=0;i<30;i++){
        for(int j=0;j<30;j++)
            e[i+j]+=b[i]*b[j];
        for(int j=0;j<=48;j++){
            e[j]+=tmp;
            tmp=0;
            if(e[j]>9){tmp=e[j]/10;e[j]=e[j]%10;}
        }
    }
} 
void jian(){
    e[0]-=4;
    for(int i=0;i<=48;i++){
        if(e[i]>=0)break;
        e[i]+=10;e[i+1]-=1;
    }
}
int main(){
    int f;
    b[0]=1;c[0]=3;
    scanf("%d",&n);
    for(int i=2;i<=n;i++) jia();
    cheng();
    if(n%2==0)jian();
    f=0;
    for(int i=49;i>=0;i--){
        if(e[i]>0) f=1;
        if(f==1) printf("%d",e[i]);
    }
    return 0;
}

  

  

This passage is made by Iscream-2001.

 

posted @ 2018-09-14 18:18  Iscream-2001  阅读(134)  评论(0编辑  收藏  举报
/* */ /* */