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

矩阵思路:用f[i][1]表示前i个里面有偶数个A和偶数个C,f[i][2]表示....然后易得。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. #define LL long long
  8. const int maxn=;
  9. const int Mod=;
  10. struct mat
  11. {
  12. int m[maxn][maxn];
  13. mat(){memset(m,,sizeof(m));};
  14. mat friend operator *(mat a,mat b)
  15. {
  16. mat d;
  17. for(int i=;i<=;i++)
  18. for(int j=;j<=;j++)
  19. for(int k=;k<=;k++)
  20. d.m[i][j]=(d.m[i][j]+a.m[i][k]*b.m[k][j])%Mod;
  21. return d;
  22. }
  23. mat friend operator ^(mat a,LL n)
  24. {
  25. mat d;
  26. for(int i=;i<=;i++) d.m[i][i]=;
  27. while(n){
  28. if(n&) d=d*a;
  29. a=a*a;
  30. n>>=;
  31. }
  32. return d;
  33. }
  34. };
  35. int main()
  36. {
  37. int i,Case,T;
  38. LL n;
  39. while(~scanf("%d",&T)&&T){
  40. Case=;
  41. while(T--){
  42. scanf("%lld",&n);
  43. mat b,ans;
  44. b.m[][]=;b.m[][]=;b.m[][]=;
  45. b.m[][]=;b.m[][]=;b.m[][]=;
  46. b.m[][]=;b.m[][]=;b.m[][]=;
  47. b.m[][]=;b.m[][]=;b.m[][]=;
  48. ans=b^n;
  49. printf("Case %d: %d\n",++Case,ans.m[][]);
  50. }
  51. printf("\n");
  52. }
  53. return ;
  54. }

然而不小心看到其他方法,一下子蒙圈了,QwQ:

方法1,找循环结构,不难想。

方法2,DP,还没有看,多半和循环结构有关。

方法3,指数形母函数,和泰勒公式有关。

高数学了泰勒,我之前也学了母函数,不过比较基础:nmphy的母函数

然后就翻论文看各种母函数。

后面发现母函数还可以解决【树的计数】问题,因为之前看过Prufer和Cayley 算法,然后就去看母函数来解决树的计数。

树的计数问题。

外文的看不懂,GG。

中文里感觉好的:

http://www.docin.com/p-538824587.html  kb就是kb,大佬!

http://www.docin.com/p-140832665.html  这篇论文和其他论文有相似之处,也有独到之处,还不错。

反正越看越觉得自己数学不够用。

http://ishare.iask.sina.com.cn/f/67448295.html 史老爷,看过他的数学分析的举个手。

学会了高阶母函数再来补充!

2017-11-15

--------------------------------------------------------------分界线就是我----------------------------------------------------------------------

2017-11-20:

感觉母函数很神奇,很强大,用处太多了。

ORZ!!!

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. #define LL long long
  8. int pow(int a,LL n)
  9. {
  10. int ans=;
  11. while(n){
  12. if(n&) ans*=a;
  13. ans%=;
  14. a=a*a%;
  15. n>>=;
  16. }
  17. return ans;
  18. }
  19. int main()
  20. {
  21. int T,i,j,ans,Case,m;
  22. LL n;
  23. while(~scanf("%d",&T)){
  24. if(T==) return ;
  25. Case=;
  26. for(i=;i<=T;i++){
  27. scanf("%lld",&n);
  28. printf("Case %d: ",++Case);
  29. printf("%d\n",(pow(,n-)+pow(,n-))%);
  30. }
  31. printf("\n");
  32. }
  33. return ;
  34. }

反正就是用这样【简单的公式】就能推出来,所以有时间的伙伴一定要看看母函数。

这里不做解释,自己看书,毕竟我也讲不清楚。

HDU2065"红色病毒"问题【指数型母函数】的更多相关文章

  1. hdu2065 "红色病毒"问题 指数型母函数

    关于指数型母函数的题目,通过用公式并展开得到系数做的吧,取最后两位就是对100取模 #include<stdio.h> int QuickPow(int a,long long n,int ...

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

    这种有限制的类棋盘着色问题一般可以用指数型母函数来解决,设Hn表示这样的着色数,首先H0=1,则Hn等于四个字母的(A,B,C,D)的多重集合的n排列数,其中每个字母的重数是无穷,且要求A,C出现的次 ...

  3. HDU2065 "红色病毒"问题 【组合数学 二项式定理】

    HDU2065 "红色病毒"问题 Description: 医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相上下,被称为"红色 ...

  4. HDU2065 “红色病毒”问题 (指数型母函数经典板题)

    题面 医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相上下,被称为"红色病毒",经研究发现,该病毒及其变种的DNA的一条单链中,胞嘧啶, ...

  5. hdu2065"红色病毒"问题(指数母函数+快速幂取模)

    "红色病毒"问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  6. [HDU2065] "红色病毒"问题

    传送门:>Here< 题意:现在有一长度为N的字符串,满足一下条件: (1) 字符串仅由A,B,C,D四个字母组成; (2) A出现偶数次(也可以不出现); (3) C出现偶数次(也可以不 ...

  7. 【指数型母函数+非递归快速幂】【HDU2065】"红色病毒"问题

    大一上学完数分上后终于可以搞懂指数型母函数了.. 需要一点关于泰勒级数的高数知识 题目在此: "红色病毒"问题 Time Limit: 1000/1000 MS (Java/Oth ...

  8. HDU 2065 "红色病毒"问题(生成函数)

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  9. hdu1521 排列组合(指数型母函数)

    题意: 有n种物品,并且知道每种物品的数量ki.要求从中选出m件物品的排数.         (全题文末) 知识点: 普通母函数 指数型母函数:(用来求解多重集的排列问题) n个元素,其中a1,a2, ...

随机推荐

  1. 前端 JavaScript&Dom

    JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...

  2. Python操作SQLAlchemy

    Mysql环境: MySQL 一.概述什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 什么是 MySQL.Oracle.SQLite.Access.MS ...

  3. Python 模块续 configparser、shutil、XML、paramiko、系统命令、

    一.configparse # 注释1 ; 注释2 [section1] # 节点 k1 = v1 # 值 k2:v2 # 值 [section2] # 节点 k1 = v1 # 值 1.获取所有节点 ...

  4. Vimium~让您的Chrome起飞

    工欲善其事,必先利其器!撸起Vimium,我的Chrome就这么起飞了. 学起(了解几个快捷键即可)And撸起Vimium,想黑客一般在Chrome上飞起.Vimium常用快捷键(注:区分大小写)j, ...

  5. PAT 天梯赛 L1-027. 出租 【模拟】

    题目链接 https://www.patest.cn/contests/gplt/L1-027 题意 给出一串电话号码,找出其中不同数字的个数,并且按递减顺序排列,然后 有一个index 数组,指出每 ...

  6. for update排他锁详解

    使用场景: 高并发并且对于数据的准确性很有要求. 落实到mysql就是在事务中使用,只有使用InnoDB时才用,在begin于commit之间使用(只有此引擎支持事务). 本质: 给表或行上个锁以便接 ...

  7. iOS_网络编程

    网络编程中有以下几种方式向服务器进行提交数据: IOS同步请求.异步请求.GET请求.POST请求 1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可 ...

  8. Linux操作系统的安装以及基本的操作命令详解

    背景:使用的虚拟机安装Linux  虚拟机使用的是VMware  Linux版本:CentOS-6.7-X86    自行下载:CentOS-6.7-x86_64-bin-DVD1.iso 打开VMw ...

  9. 利用Phoenix为HBase创建二级索引

    为什么需要Secondary Index 对于Hbase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询.如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄. ...

  10. volist/foreach下,点击循环中的一个进行操作

    第一种方法,是给点击元素绑定事件,用ajax将值传到控制器中,其中传的值,用jquery选择器选择值. 1.在html中 <foreach name="save" item= ...