• 【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.
  • 相关阅读:
    【译文】HTML5 Canvas的点击区域检测以及如何监听Canvas上各种图形的点击事件
    快速排序法精简理解
    数据结构--堆
    数据结构--哈希表
    数据结构--队列
    数据结构--栈
    数据结构--数组
    数据结构--链表
    算法的基本知识
    Arthas
  • 原文地址:https://www.cnblogs.com/DMoon/p/5247765.html
Copyright © 2020-2023  润新知