1002: [FJOI2007]轮状病毒

76 篇文章 0 订阅
50 篇文章 0 订阅

Description

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

Input

第一行有1个正整数n。

Output

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

Sample Input

3

Sample Output

16


基尔霍夫矩阵(我也不知道是什么)推出f[i]=(f[i-1]*3-f[i-2]+2)

给定一个有n个顶点的图G,它的拉普拉斯矩阵
定义为:
L=D-A
其中D为图的度矩阵,A为图的 邻接矩阵。度矩阵在有向图中,只需要考虑出度或者入度中的一个。经过计算可以得
1、若i
 =j,则
为顶点
的度。
2、若i≠ j,但顶点
和顶点
相邻,则
3、其它情况
也可以将这三种值通过除以
进行标准化。

code:

#include<iostream>
#include<cstdio>
using namespace std ;
struct data {
       int a [ 101 ] , len ;
       } ;
int n ;
data mul ( data a , int k )
{
     for ( int i = 1 ; i <= a . len ; i ++ )
             a . a [ i ] *= k ;
     for ( int i = 1 ; i <= a . len ; i ++ )
     {
             a . a [ i + 1 ] += a . a [ i ] / 10 ;
             a . a [ i ] %= 10 ;
             }
     if ( a . a [ a . len + 1 ] != 0 ) a . len ++ ;
     return a ;
}
data sub ( data a , data b )
{
     a . a [ 1 ] += 2 ;
     int j = 1 ;
     while ( a . a [ j ] >= 10 ) { a . a [ j ] %= 10 ; a . a [ j + 1 ] ++ ; j ++ ; }
     for ( int i = 1 ; i <= a . len ; i ++ )
     {
           a . a [ i ] -= b . a [ i ] ;
           if ( a . a [ i ] < 0 ) { a . a [ i ] += 10 ; a . a [ i + 1 ] -- ; }
     }
     while ( a . a [ a . len ] == 0 ) a . len -- ;
     return a ;
}
int main ( )
{
     data f [ 101 ] ; f [ 1 ] . a [ 1 ] = 1 ; f [ 2 ] . a [ 1 ] = 5 ;
     f [ 1 ] . len = f [ 2 ] . len = 1 ;
     scanf ( "%d" , &n ) ;
     for ( int i = 3 ; i <= n ; i ++ )
             f [ i ] = sub ( mul ( f [ i - 1 ] , 3 ) , f [ i - 2 ] ) ;
     for ( int i = f [ n ] . len ; i > 0 ; i -- )
       printf ( "%d" , f [ n ] . a [ i ] ) ;
     return 0 ;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值