zoukankan      html  css  js  c++  java
  • BZOJ1002

    1002: [FJOI2007]轮状病毒

    Description

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

    Input

    第一行有1个正整数n。

    Output

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

    Sample Input

    3

    Sample Output

    16

    ----------------------------->_<------------------------------

    仔细推规律可以发现本题有递推式(基尔霍夫矩阵)

    „F[i]=3*f[i-1]-f[i-2]+2;
    „F[1]=1 f[2]=5(By Vfk OrzOrz)
    注意高精
     1 #include<iostream>
     2 #include<stdlib.h>
     3 #include<stdio.h>
     4 #include<math.h>
     5 #include<algorithm>
     6 #include<vector>
     7 #include<queue>
     8 using namespace std;
     9 int n;
    10 struct gj
    11 {
    12     int b[1501];
    13     int cd;
    14     gj(){for(int i=1;i<=n;i++)b[i]=0;cd=0;}
    15 }f[151];
    16 gj operator *(int a,gj b)
    17 {
    18     gj c=gj();
    19     for(int i=1;i<=b.cd;i++)
    20     {c.b[i+1]=(c.b[i]+b.b[i]*a)/10;c.b[i]=(c.b[i]+b.b[i]*a)%10;} 
    21     if(c.b[b.cd+1]>0)c.cd=b.cd+1;
    22     else c.cd=b.cd;
    23     return c;
    24 }
    25 gj operator -(gj a,gj b)
    26 {
    27     gj c=gj();
    28     for(int i=1;i<=a.cd;i++)
    29     {
    30         c.b[i]+=a.b[i]-b.b[i];
    31         if(c.b[i]<0)
    32         {c.b[i]+=10;c.b[i+1]=-1;}
    33     } 
    34     for(int i=a.cd;i>=1;i--)
    35       if(c.b[i]!=0)
    36        {c.cd=i;break;}
    37      return c;
    38 }
    39 gj operator +(gj a,int b)
    40 {
    41     gj c=gj();
    42     a.b[1]+=b;
    43     for(int i=1;i<=a.cd;i++)
    44     {
    45         c.b[i+1]=(c.b[i]+a.b[i])/10;
    46         c.b[i]=(c.b[i]+a.b[i])%10;
    47     }
    48     if(c.b[a.cd+1]>0)c.cd=a.cd+1;
    49     else c.cd=a.cd;
    50     return c;
    51 }
    52 void init()
    53 {
    54     scanf("%d",&n);
    55     f[1].b[1]=1;f[2].b[1]=5;
    56     f[1].cd=1;f[2].cd=1;
    57     for(int i=3;i<=n;i++)
    58     f[i]=3*f[i-1]-f[i-2]+2;
    59     //f[n]=3*f[n-1]-f[n-2]+2;
    60     //for(int i=f[n-2].cd;i>=1;i--)
    61     //cout<<f[n-2].b[i];
    62     //cout<<endl;
    63     //for(int i=f[n-1].cd;i>=1;i--)
    64     //cout<<f[n-1].b[i];
    65     // cout<<endl;
    66     for(int i=f[n].cd;i>=1;i--)
    67     cout<<f[n].b[i];
    68     cout<<endl;
    69 } 
    70 int main()
    71 {
    72     //freopen("1002.out","r",stdin);
    73     init();
    74     return 0;
    75 }
  • 相关阅读:
    Java的日期类和日期格式化类
    Java中的内部类
    c#中的里氏转换和Java中强制类型转换在多态中的应用
    MySQL存储引擎
    如何控制多线程执行顺序
    为什么 1000==1000 返回为false,而 100==100 会返回为true
    HashMap和HashTable的区别
    打印昨天的当前时刻
    怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?
    MyBatis中 # 和 $ 的区别?
  • 原文地址:https://www.cnblogs.com/diamonddd/p/4577146.html
Copyright © 2011-2022 走看看