zoukankan      html  css  js  c++  java
  • 【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度

    Description

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

    Input

    第一行有1个正整数n。

    Output

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

    Sample Input

    3

    Sample Output

    16

    HINT

     

    Source

    Solution:推导不会,看不懂,知道了公式f[i]=f[i-1]*3-f[i-2]+2;要加高精度然后水过,可以打表找规律,不太会打。。。找规律,VFK的推导清晰全过程

     1 #include <iostream>
     2 #include <cstdio>
     3 using namespace std;
     4 struct data{int a[101],len;}f[101];
     5 int n;
     6 data gjc(data a,int k)
     7 {
     8     for (int i=1;i<=a.len;i++)    a.a[i]*=k;
     9     for (int i=1;i<=a.len;i++)
    10     {
    11         a.a[i+1]+=a.a[i]/10;
    12         a.a[i]%=10;
    13     }
    14     if (a.a[a.len+1]!=0)    a.len++;
    15     return a;
    16 }
    17 
    18 data gjj(data a,data b)
    19 {
    20     a.a[1]+=2;
    21     int j=1;
    22     while (a.a[j]>=10)
    23     {
    24         a.a[j]%=10;
    25         a.a[j+1]++;        
    26         j++;
    27     }
    28     if (a.a[a.len+1]!=0) a.len++;
    29     for (int i=1;i<=a.len;i++)
    30     {
    31         a.a[i]-=b.a[i];
    32         if (a.a[i]<0) {a.a[i]+=10;    a.a[i+1]--;}
    33     }
    34     while (a.a[a.len]==0)    a.len--;
    35     return a;
    36 }
    37 
    38 int main()
    39 {
    40     scanf("%d",&n);
    41     f[1].a[1]=1;f[2].a[1]=5;
    42     f[1].len=f[2].len=1;
    43     for (int i=3;i<=n;i++)
    44         f[i]=gjj(gjc(f[i-1],3),f[i-2]);
    45     for (int i=f[n].len;i>0;i--)
    46         printf("%d",f[n].a[i]);
    47     return 0;
    48 }
    View Code
    —Anime Otaku Save The World.
  • 相关阅读:
    DBA 职责及日常工作职责
    mysql 语句笔记
    学习Groovy — 闭包
    linux 命令: 网络和进程
    linux命令: rm命令
    Pro Git-- 跟踪分支
    Redis Tutorial
    linux 命令--文件操作
    分库分表的几种常见形式
    乐观锁与悲观锁
  • 原文地址:https://www.cnblogs.com/DMoon/p/5247765.html
Copyright © 2011-2022 走看看