zoukankan      html  css  js  c++  java
  • BZOJ-1002: [FJOI2007]轮状病毒(打表找规律or递推 + 高精度)

    1002: [FJOI2007]轮状病毒

    Time Limit: 1 Sec  Memory Limit: 162 MB
    Submit: 5803  Solved: 3154
    [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

    HINT

     

    Source

    我承认我承认……这题是在路边沾花惹草遇到的……因为看到那个递推的式子极其的简单所以就写了 _(:зゝ∠)_ 对了这貌似是我第一次写高精度减法 *▽*

    http://blog.csdn.net/Clove_unique/article/details/51438878

     1 #include "bits/stdc++.h"
     2 using namespace std;
     3 typedef long long LL;
     4 const int MAX=105;
     5 int n;
     6 struct Node{
     7     int a[505];
     8     Node (){memset(a,0,sizeof(a));}
     9     Node operator * (const Node tt) {
    10         int i,j,k;
    11         Node an;an.a[0]=a[0]+tt.a[0];
    12         for (i=1;i<=a[0];i++){
    13             for (j=1;j<=tt.a[0];j++){
    14                 an.a[i+j-1]+=a[i]*tt.a[j];
    15                 an.a[i+j]+=an.a[i+j-1]/10;
    16                 an.a[i+j-1]%=10;
    17             }
    18         }
    19         while (an.a[an.a[0]]==0) an.a[0]--;
    20         return an;
    21     }
    22     Node operator + (const Node &tt) {
    23         int i,j;
    24         Node an;an.a[0]=max(a[0],tt.a[0])+1;
    25         for (i=1;i<=max(a[0],tt.a[0]);i++){
    26             an.a[i]+=a[i]+tt.a[i];
    27             an.a[i+1]+=an.a[i]/10;
    28             an.a[i]%=10;
    29         }
    30         while (an.a[an.a[0]]==0) an.a[0]--;
    31         return an;
    32     }
    33     Node operator - (const Node &tt) {
    34         int i,j;
    35         Node an;an.a[0]=a[0];
    36         for (i=1;i<=a[0];i++){
    37             if (a[i]<tt.a[i]) a[i+1]--,a[i]+=10;
    38             an.a[i]=a[i]-tt.a[i];
    39         }
    40         while (an.a[an.a[0]]==0) an.a[0]--;
    41         return an;
    42     }
    43 }f[MAX];
    44 int main(){
    45     freopen ("virus.in","r",stdin);
    46     freopen ("virus.out","w",stdout);
    47     int i,j;
    48     scanf("%d",&n);
    49     f[1].a[0]=f[1].a[1]=f[2].a[0]=1;f[2].a[1]=5;
    50     Node x;x.a[0]=1,x.a[1]=2;
    51     Node y;y.a[0]=1,y.a[1]=3;
    52     for (i=3;i<=n;i++)
    53         f[i]=f[i-1]*y-f[i-2]+x;
    54     for (i=f[n].a[0];i>0;i--)
    55         printf("%d",f[n].a[i]);
    56     return 0;
    57 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    Android JNI和NDK学习(04)--NDK调试方法(转)
    Android JNI和NDK学习(03)--动态方式实现JNI(转)
    Android JNI和NDK学习(02)--静态方式实现JNI(转)
    Android JNI和NDK学习(01)--搭建NDK开发环境(转)
    C++语言基础(7)-inline内联函数
    C++语言基础(6)-const 关键字
    C++语言基础(5)-this和static关键字
    红黑树:个人理解与Python实现
    最小堆实现优先队列:Python实现
    二叉查找树:Python实现
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/7695726.html
Copyright © 2011-2022 走看看