HDU 2065 "红色病毒"问题 指数生成函数

题目大意:求长度为n的DNA单链,满足C和T出现偶数次,A和G任意,这样的DNA单链有多少种

去学了下指数生成函数……

设函数A(x)=∑+∞i=0Aixii!

那么两种元素的组合就是A(x)?B(x)

理由很简单,我们发现

Aixii!?Bjxjj!=Ai?Bj?(i+j)!i!?j!xi+j(i+j)!

组合数就这样被搞出来了

那么对于此题,A和G的生成函数显然是1+x1!+x22!+...=ex

而C和T的生成函数则是1+x22!+x44!+...=ex+e?x2

故答案函数F(x)=e2x(ex+e?x2)2

=e4x+2e2x+14

因此n次项系数为4n+2?2n4=4n?1+2n?1

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MOD 400
using namespace std;
unsigned long long n;
int Quick_Power(int x,unsigned long long y)
{
    int re=1;
    while(y)
    {
        if(y&1) (re*=x)%=MOD;
        (x*=x)%=MOD; y>>=1;
    }
    return re;
}
int main()
{
    int T;
    while(cin>>T,T)
    {
        int cnt=0;
        for(;T;T--)
        {
            cin>>n;
            printf("Case %d: ",++cnt);
            cout<<(Quick_Power(4,n)+2*Quick_Power(2,n))%MOD/4<<endl;
        }
        puts("");
    }
    return 0;
}
时间: 2024-10-10 09:10:39

HDU 2065 "红色病毒"问题 指数生成函数的相关文章

HDU 2065 红色病毒 指数型母函数+泰勒公式

医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相上下,被称为"红色病毒",经研究发现,该病毒及其变种的DNA的一条单链中,胞嘧啶,腺嘧啶均是成对出现的. 现在有一长度为N的字符串,满足一下条件: (1) 字符串仅由A,B,C,D四个字母组成; (2) A出现偶数次(也可以不出现); (3) C出现偶数次(也可以不出现); 计算满足条件的字符串个数. 当N=2时,所有满足条件的字符串有如下6个:BB,BD,DB,DD,AA,CC. 由于这个数据

HDU 2065 “红色病毒”问题 --指数型母函数

打分的

[HDOJ2065]&quot;红色病毒&quot;问题

"红色病毒"问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4742    Accepted Submission(s): 1985 Problem Description 医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相上下,被称为"红色病毒",经研究发现,

HDU2065 &quot;红色病毒&quot;问题 【快速幂】

"红色病毒"问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4355    Accepted Submission(s): 1807 Problem Description 医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相上下,被称为"红色病毒",经研究发现

hdu2065 &quot;红色病毒&quot;问题 指数型母函数

关于指数型母函数的题目,通过用公式并展开得到系数做的吧,取最后两位就是对100取模 1 #include<stdio.h> 2 3 int QuickPow(int a,long long n,int p){ 4 int temp=a,ans=1; 5 while(n){ 6 if(n&1)ans=ans*temp%p; 7 n>>=1; 8 temp=temp*temp%p; 9 } 10 return ans; 11 } 12 13 int main(){ 14 int

hdu 2065

ps:我的天...看网上各种难..对于我这个比较懒得人...我就找规律直接水过去了...前20一个循环,注意跳过第一轮的3个数就行..然后觉得比较坑的是,那个输入N,要用long long型... 代码: #include "stdio.h" int dp1[]={1,2,6}; int dp[]={32,52,56,20,72,72,56,60,12,92,56,0,52,12,56,40,92,32,56,80}; int main(){ int T,i,k; long long

递推+矩阵快速幂 HDU 2065

1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 //矩阵大小上限 8 const int SIZ=100; 9 int MOD=100; 10 11 //矩阵大小为n*m,初始化全部为0 12 struct mat 13 { 14 int n,m; 15 int ar[SIZ][SIZ]; 16 mat() 17 { 18 memset

母函数专题

1.Hdu 2082 找单词 题意:单词A-Z具有1-26的价值,现有字母A-Z的个数num[i],求问在不超过价值为五十的情况下,有多少种字母的组合数. 思路:用指数代表价值,价值又为数组的下标:用系数代表组成该价值的方案数,方案数为数组中存的值. 1 #include<iostream> 2 #include<memory.h> 3 using namespace std; 4 int re[55]; 5 int p1[55]; 6 int p2[55]; 7 int xx[2

转载:hdu 题目分类 (侵删)

转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092.1093. 1094.1095.1096.1097.1098.1106.1108.1157.116