• BZOJ1002 [FJOI2007]轮状病毒(最小生成树计数)


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

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

    代码:

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cmath>
      4 #include<algorithm>
      5 #include<queue>
      6 #include<cstring>
      7 #define PAU putchar(' ')
      8 #define ENT putchar('
    ')
      9 #define eps 1e-8
     10 using namespace std;
     11 const int maxn=105;
     12 struct bign{
     13     int len,s[maxn];  
     14     bign(){memset(s,0,sizeof(s));len=1;}
     15     bign(int num){*this=num;}
     16     bign(const char *num){*this=num;}
     17     bign operator = (const int num){
     18         char s[maxn];  sprintf(s,"%d",num);  
     19         *this = s;return *this;
     20     }
     21     bign operator = (const char *num){
     22         for(int i=0;num[i]=='0';num++);
     23         len=strlen(num);  
     24         for(int i=0;i<len;i++) s[i]=num[len-i-1]-'0';  
     25         return *this;
     26     }
     27     bign operator + (const bign &b) const{
     28         bign c;c.len=0;
     29         for(int i=0,g=0;g||i<max(len,b.len);i++)  {
     30             int x=g;
     31             if(i<len) x+=s[i];  
     32             if(i<b.len) x+=b.s[i];
     33             c.s[c.len++]=x%10;  
     34             g=x/10;
     35         } return c;  
     36     }
     37     void clean(){while(len > 1 && !s[len-1]) len--;return;}
     38     bign operator * (const bign &b){
     39         bign c;
     40         c.len=len+b.len;  
     41         for(int i=0;i<len;i++) for(int j=0;j<b.len;j++) c.s[i+j]+=s[i]*b.s[j];  
     42         for(int i=0;i<c.len;i++){
     43             c.s[i+1]+=c.s[i]/10;  
     44             c.s[i]%=10;
     45         } c.clean();return c;  
     46     }
     47     bign operator - (const bign &b){
     48         bign c;c.len=0;
     49         for(int i=0,g=0;i<len;i++){
     50             int x=s[i]-g;if(i<b.len) x-=b.s[i];  
     51             if(x>=0) g=0;  
     52             else g=1,x+=10;
     53             c.s[c.len++]=x;
     54         } c.clean();return c;  
     55     }
     56     bign operator / (const bign &b)  {
     57         bign c,f=0;
     58         for(int i=len-1;i>=0;i--){
     59             f=f*10;f.s[0]=s[i];
     60             while(!(f<b)) f=f-b,c.s[i]++;
     61         } c.len=len;c.clean();return c;  
     62     }
     63     bign operator % (const bign &b)  {
     64         bign r = *this / b;
     65         r = *this - r*b;
     66         return r;
     67     }
     68     bool operator < (const bign &b)  {
     69         if(len!=b.len) return len<b.len;  
     70         for(int i=len-1;i>=0;i--){
     71             if(s[i]!=b.s[i]) return s[i]<b.s[i];  
     72         } return false;
     73     }
     74     bool operator > (const bign &b){
     75         if(len!=b.len) return len>b.len;  
     76         for(int i=len-1;i>=0;i--){
     77             if(s[i]!=b.s[i]) return s[i]>b.s[i];  
     78         } return false;  
     79     }
     80     bool operator == (const bign &b){
     81         return !(*this>b)&&!(*this<b);  
     82     }
     83     bool operator >= (const bign &b){
     84         return (*this>b)||(*this==b);
     85     }
     86     void print(){
     87         for(int i=len-1;i>=0;i--) putchar(s[i]+'0');return;
     88     }
     89 }f[maxn];
     90 inline int read(){
     91     int x=0,sig=1;char ch=getchar();
     92     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
     93     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
     94     return x*=sig;
     95 }
     96 inline void write(int x){
     97     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
     98     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
     99     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    100 }
    101 int n;
    102 void init(){
    103     n=read();f[1]=1;f[2]=5;
    104     return;
    105 }
    106 void work(){
    107     for(int i=3;i<=n;i++) f[i]=f[i-1]*3-f[i-2]+2;
    108     return;
    109 }
    110 void print(){
    111     f[n].print();
    112     return;
    113 }
    114 int main(){init();work();print();}
    View Code
  • 相关阅读:
    20145303刘俊谦 《Java程序设计》第三周学习总结
    20145303刘俊谦 《Java程序设计》第2周学习总结
    MWeb Lite以及Eclipse的使用感想
    学号20145303 《Java程序设计》第一周学习总结
    问卷调查
    20145235 《Java程序设计》第5周学习总结
    20145235 《Java程序设计》第4周学习总结
    20145235李涛 《Java程序设计》第3周学习总结
    20145235 学号 《Java程序设计》第2周学习总结
    20145235李涛《Java程序设计》第一周学习总结
  • 原文地址:https://www.cnblogs.com/csushl/p/10065232.html
Copyright © 2020-2023  润新知