zoukankan      html  css  js  c++  java
  • hdu 2065 "红色病毒"问题

    "红色病毒"问题

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 5562    Accepted Submission(s): 2323


    Problem Description
    医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相上下,被称为"红色病毒",经研究发现,该病毒及其变种的DNA的一条单链中,胞嘧啶,腺嘧啶均是成对出现的。
    现在有一长度为N的字符串,满足一下条件:
    (1) 字符串仅由A,B,C,D四个字母组成;
    (2) A出现偶数次(也可以不出现);
    (3) C出现偶数次(也可以不出现);
    计算满足条件的字符串个数.
    当N=2时,所有满足条件的字符串有如下6个:BB,BD,DB,DD,AA,CC.
    由于这个数据肯能非常庞大,你只要给出最后两位数字即可.
     
    Input
    每组输入的第一行是一个整数T,表示测试实例的个数,下面是T行数据,每行一个整数N(1<=N<2^64),当T=0时结束.
     
    Output
    对于每个测试实例,输出字符串个数的最后两位,每组输出后跟一个空行.
     
    Sample Input
    4
    1
    4
    20
    11
    3
    14
    24
    6
    0
     
    Sample Output
    Case 1: 2
    Case 2: 72
    Case 3: 32
    Case 4: 0
     
    Case 1: 56
    Case 2: 72
    Case 3: 56
     
    Author
    Rabbit
     
    Source
     
    Recommend
    lcy   |   We have carefully selected several similar problems for you:  2067 2062 2073 2079 2082 
     
    貌似是数学题。。。反正宝宝完全看不懂,我只是照着代码敲了一遍。。
     
    复制别人的题解:

    由4种字母组成,A和C只能出现偶数次。

    构造指数级生成函数:(1+x/1!+x^2/2!+x^3/3!……)^2*(1+x^2/2!+x^4/4!+x^6/6!……)^2.

    前面是B和D的情况,可以任意取,但是相同字母一样,所以要除去排列数。后者是A和C的情况,只能取偶数个情况。

    根据泰勒展开,e^x在x0=0点的n阶泰勒多项式为 1+x/1!+x^2/2!+x^3/3!……

    而后者也可以进行调整,需要把奇数项去掉,则e^(-x)的展开式为1-x/1!+X^2/2!-X^3/3!……

    所以后者可以化简为(e^x+e^(-x))/2。则原式为 (e^x)^2   *  ((e^x*e^(-x))/2)^2

    整理得到e^4x+2*e^2x+1。

    又由上面的泰勒展开 

    e^4x = 1 + (4x)/1! + (4x)^2/2! + (4x)^3/3! + ... + (4x)^n/n!;

    e^2x = 1 + (2x)/1! + (2x)^2/2! + (2x)^3/3! + ... + (2x)^n/n!;

    对于系数为n的系数为(4^n+2*2^n)/4=4^(n-1)+2^(n-1);

    快速幂搞之。

    题意:中文题,很好理解。

    附上代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #define mod 100
     5 using namespace std;
     6 int xx(int a,__int64 b)
     7 {
     8     int t=1;
     9     while(b)
    10     {
    11         if(b&1)
    12         t=(t*a)%mod;
    13         a=(a*a)%mod;
    14         b>>=1;
    15     }
    16     return t;
    17 }
    18 int main()
    19 {
    20     int n,i,j;
    21     __int64 m;
    22     while(~scanf("%d",&n)&&n)
    23     {
    24         int T=0;
    25         while(n--)
    26         {
    27             scanf("%I64d",&m);
    28             printf("Case %d: %d
    ",++T,(xx(4,m-1)+xx(2,m-1))%mod);
    29         }
    30         printf("
    ");
    31     }
    32     return 0;
    33 }
  • 相关阅读:
    JVM的基础知识
    tmux常用命令
    JAVA基础—方法覆写、多态
    datetime模块
    time()函数
    Packet Tracer 思科模拟器入门教程 之二 交换机的基本配置与管理
    单元测试前篇
    em
    视口
    浮动
  • 原文地址:https://www.cnblogs.com/pshw/p/5322478.html
Copyright © 2011-2022 走看看