HDU2065"红色病毒"问题【指数型母函数】
现在有一长度为N的字符串,满足一下条件:
(1) 字符串仅由A,B,C,D四个字母组成;
(2) A出现偶数次(也可以不出现);
(3) C出现偶数次(也可以不出现);
计算满足条件的字符串个数.
当N=2时,所有满足条件的字符串有如下6个:BB,BD,DB,DD,AA,CC.
由于这个数据肯能非常庞大,你只要给出最后两位数字即可.
1
4
20
11
3
14
24
6
0
矩阵思路:用f[i][1]表示前i个里面有偶数个A和偶数个C,f[i][2]表示....然后易得。
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- #define LL long long
- const int maxn=;
- const int Mod=;
- struct mat
- {
- int m[maxn][maxn];
- mat(){memset(m,,sizeof(m));};
- mat friend operator *(mat a,mat b)
- {
- mat d;
- for(int i=;i<=;i++)
- for(int j=;j<=;j++)
- for(int k=;k<=;k++)
- d.m[i][j]=(d.m[i][j]+a.m[i][k]*b.m[k][j])%Mod;
- return d;
- }
- mat friend operator ^(mat a,LL n)
- {
- mat d;
- for(int i=;i<=;i++) d.m[i][i]=;
- while(n){
- if(n&) d=d*a;
- a=a*a;
- n>>=;
- }
- return d;
- }
- };
- int main()
- {
- int i,Case,T;
- LL n;
- while(~scanf("%d",&T)&&T){
- Case=;
- while(T--){
- scanf("%lld",&n);
- mat b,ans;
- b.m[][]=;b.m[][]=;b.m[][]=;
- b.m[][]=;b.m[][]=;b.m[][]=;
- b.m[][]=;b.m[][]=;b.m[][]=;
- b.m[][]=;b.m[][]=;b.m[][]=;
- ans=b^n;
- printf("Case %d: %d\n",++Case,ans.m[][]);
- }
- printf("\n");
- }
- return ;
- }
然而不小心看到其他方法,一下子蒙圈了,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!!!
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- #define LL long long
- int pow(int a,LL n)
- {
- int ans=;
- while(n){
- if(n&) ans*=a;
- ans%=;
- a=a*a%;
- n>>=;
- }
- return ans;
- }
- int main()
- {
- int T,i,j,ans,Case,m;
- LL n;
- while(~scanf("%d",&T)){
- if(T==) return ;
- Case=;
- for(i=;i<=T;i++){
- scanf("%lld",&n);
- printf("Case %d: ",++Case);
- printf("%d\n",(pow(,n-)+pow(,n-))%);
- }
- printf("\n");
- }
- return ;
- }
反正就是用这样【简单的公式】就能推出来,所以有时间的伙伴一定要看看母函数。
这里不做解释,自己看书,毕竟我也讲不清楚。
HDU2065"红色病毒"问题【指数型母函数】的更多相关文章
- hdu2065 "红色病毒"问题 指数型母函数
关于指数型母函数的题目,通过用公式并展开得到系数做的吧,取最后两位就是对100取模 #include<stdio.h> int QuickPow(int a,long long n,int ...
- HDU 2065 “红色病毒”问题 --指数型母函数
这种有限制的类棋盘着色问题一般可以用指数型母函数来解决,设Hn表示这样的着色数,首先H0=1,则Hn等于四个字母的(A,B,C,D)的多重集合的n排列数,其中每个字母的重数是无穷,且要求A,C出现的次 ...
- HDU2065 "红色病毒"问题 【组合数学 二项式定理】
HDU2065 "红色病毒"问题 Description: 医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相上下,被称为"红色 ...
- HDU2065 “红色病毒”问题 (指数型母函数经典板题)
题面 医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相上下,被称为"红色病毒",经研究发现,该病毒及其变种的DNA的一条单链中,胞嘧啶, ...
- hdu2065"红色病毒"问题(指数母函数+快速幂取模)
"红色病毒"问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- [HDU2065] "红色病毒"问题
传送门:>Here< 题意:现在有一长度为N的字符串,满足一下条件: (1) 字符串仅由A,B,C,D四个字母组成; (2) A出现偶数次(也可以不出现); (3) C出现偶数次(也可以不 ...
- 【指数型母函数+非递归快速幂】【HDU2065】"红色病毒"问题
大一上学完数分上后终于可以搞懂指数型母函数了.. 需要一点关于泰勒级数的高数知识 题目在此: "红色病毒"问题 Time Limit: 1000/1000 MS (Java/Oth ...
- HDU 2065 "红色病毒"问题(生成函数)
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- hdu1521 排列组合(指数型母函数)
题意: 有n种物品,并且知道每种物品的数量ki.要求从中选出m件物品的排数. (全题文末) 知识点: 普通母函数 指数型母函数:(用来求解多重集的排列问题) n个元素,其中a1,a2, ...
随机推荐
- 前端 JavaScript&Dom
JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...
- Python操作SQLAlchemy
Mysql环境: MySQL 一.概述什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 什么是 MySQL.Oracle.SQLite.Access.MS ...
- Python 模块续 configparser、shutil、XML、paramiko、系统命令、
一.configparse # 注释1 ; 注释2 [section1] # 节点 k1 = v1 # 值 k2:v2 # 值 [section2] # 节点 k1 = v1 # 值 1.获取所有节点 ...
- Vimium~让您的Chrome起飞
工欲善其事,必先利其器!撸起Vimium,我的Chrome就这么起飞了. 学起(了解几个快捷键即可)And撸起Vimium,想黑客一般在Chrome上飞起.Vimium常用快捷键(注:区分大小写)j, ...
- PAT 天梯赛 L1-027. 出租 【模拟】
题目链接 https://www.patest.cn/contests/gplt/L1-027 题意 给出一串电话号码,找出其中不同数字的个数,并且按递减顺序排列,然后 有一个index 数组,指出每 ...
- for update排他锁详解
使用场景: 高并发并且对于数据的准确性很有要求. 落实到mysql就是在事务中使用,只有使用InnoDB时才用,在begin于commit之间使用(只有此引擎支持事务). 本质: 给表或行上个锁以便接 ...
- iOS_网络编程
网络编程中有以下几种方式向服务器进行提交数据: IOS同步请求.异步请求.GET请求.POST请求 1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可 ...
- Linux操作系统的安装以及基本的操作命令详解
背景:使用的虚拟机安装Linux 虚拟机使用的是VMware Linux版本:CentOS-6.7-X86 自行下载:CentOS-6.7-x86_64-bin-DVD1.iso 打开VMw ...
- 利用Phoenix为HBase创建二级索引
为什么需要Secondary Index 对于Hbase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询.如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄. ...
- volist/foreach下,点击循环中的一个进行操作
第一种方法,是给点击元素绑定事件,用ajax将值传到控制器中,其中传的值,用jquery选择器选择值. 1.在html中 <foreach name="save" item= ...