zoukankan      html  css  js  c++  java
  • 【bzoj1002】[FJOI2007]轮状病毒

    1002: [FJOI2007]轮状病毒

    Time Limit: 1 Sec  Memory Limit: 162 MB
    Submit: 4381  Solved: 2393
    [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
     
     
    用基尔多夫矩阵推出一个递推式:f[i]=f[i-1]*3-f[i-2]+2  (我也不会证)
    关于基尔多夫矩阵,传送门:http://www.cnblogs.com/chty/p/5868327.html
    当然,得用到高精度。
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<cmath>
     6 #include<ctime>
     7 #include<algorithm>
     8 using namespace std;
     9 struct bignum{int len,num[1010];}f[110],p;
    10 int n;
    11 bignum add(bignum a,bignum b)
    12 {
    13     int len;  bignum c;
    14     memset(c.num,0,sizeof(c.num));
    15     if(a.len>=b.len) len=a.len;
    16     else len=b.len;
    17     for(int i=1;i<=len;i++)
    18     {
    19         c.num[i]+=a.num[i]+b.num[i];
    20         if(c.num[i]>=10) 
    21         {
    22             c.num[i+1]+=1;
    23             c.num[i]-=10;
    24         }
    25     }
    26     if(c.num[len]>0)
    27         len++;
    28     c.len=len;
    29     return c;
    30 }
    31 bignum Mull(bignum a,int b)
    32 {
    33     int i,len;  bignum c;
    34     len=a.len;
    35     memset(c.num,0,sizeof(c.num));
    36     for(i=1;i<=len;i++)
    37     {
    38         c.num[i]+=(a.num[i]*b);
    39         if(c.num[i]>=10)
    40         {
    41             c.num[i+1]=c.num[i]/10;
    42             c.num[i]=c.num[i]%10;
    43         }
    44     } 
    45     len=len+1;
    46     while(c.num[len]>0)
    47     {
    48         c.num[len+1]=c.num[len]/10;
    49         c.num[len++]%=10;
    50     }    
    51     c.len=--len;
    52     return c;
    53 }
    54 bignum sub(bignum a1,bignum b1)
    55 {
    56     int len;
    57     if(a1.len>b1.len)  len=a1.len;
    58     else  len=b1.len;
    59     for(int i=1;i<=len;i++)
    60     {
    61         a1.num[i]=a1.num[i]-b1.num[i];
    62         if(a1.num[i]<0)
    63         {
    64             a1.num[i]+=10;
    65             a1.num[i+1]--;
    66         }
    67         
    68     }
    69     while(a1.num[len]==0&&len>1)  len--;
    70     a1.len=len;
    71     return a1;
    72 }
    73 
    74 void print(bignum c)
    75 {
    76     for(int i=c.len;i>0;i--)
    77         printf("%d",c.num[i]);
    78     printf("
    ");
    79 }
    80 int main()
    81 {
    82     scanf("%d",&n);
    83     f[1].len=f[2].len=p.len=1;
    84     f[1].num[1]=1;  f[2].num[1]=5;  p.num[1]=2;
    85     for(int i=3;i<=n;i++)
    86         f[i]=sub(add(Mull(f[i-1],3),p),f[i-2]);
    87     print(f[n]);
    88     return 0;
    89 }
    View Code
  • 相关阅读:
    javaApi Swagger配置
    java跨域配置
    applation.properties与applation.yml关于sql数据库连接配置的区别
    SpringBoot学习记录一
    Centos命令行报bash:.....:command not found的解决办法
    Referenced file contains errors (http://JAVA.sun.com/xml/ns/j2ee/web-app_2_5.xsd).
    C# 两种封装的区别
    此 ObjectContext 实例已释放,不可再用于需要连接的操作。
    .net MVC ajax传递数组
    正则表达式移除首部尾部多余字符
  • 原文地址:https://www.cnblogs.com/chty/p/5846687.html
Copyright © 2011-2022 走看看