SARS病毒 (生成函数 + 快速幂)
链接:https://ac.nowcoder.com/acm/contest/992/A
来源:牛客网
题目描述
目前,SARS 病毒的研究在世界范围内进行,经科学家研究发现,该病毒及其变种的 DNA 的一条单链中,胞嘧啶、腺嘧啶均是成对出现的。这虽然是一个重大发现,但还不是该病毒的最主要特征,因为这个特征实在太弱了。
为了进一步搞清楚该病毒的特征,CN 疾病控制中心和阿里巴巴集团合作,用科技的力量和程序的思维来解决这个难题。现阿里巴巴特委派你成为 CN 疾病控制中心的 SARS 高级研究员,去研究在这个特征下,可能成为 SARS 病毒的 DNA 序列的个数。更精确地说,你需要统计所有满足下列条件的长度为 n 的字符串的个数:
- 字符串仅由 A、T、C、G 组成
- A 出现偶数次(也可以不出现)
- C 出现偶数次(也可以不出现)
当 n=2 时,所有满足条件的字符串有如下 6个:
TT,TG,GT,GG,AA,CC。
注: 由于这个数可能非常庞大,你只需给出对 10^9+7 取模的结果即可。
输入描述:
多组输入(不超过10组),每行一个整数n:0 < n < 10^10^5
输出描述:
对于输入文件中的每一个 n,输出满足条件的字符串的个数对 10^9 +7 取模的结果。
输入
1
2
100
输出
2
6
113046907
析:首先这个一个生成函数的题目,从ACGT中可以知道,AC只能出现偶数次,而GT可以奇数,可以偶数,那么列出的生成函数是前面那个是AC的,后面那个是GT的,这样列出来之后,就只要算出
这一项的系数就是答案了。
首先这个直接求是肯定求不出来的,要使用泰勒展式来求。![]()
根据上面两个式子,可以对生成函数进行化简,化简后的结果就是
再根据泰勒展式,求出
该项的系数。
最终的结果就是,结果看起来很简单啊,但是 n 实在是太大了啊,所以还需要对 n 进行处理。
假设求 2n 这个结果,首先是要对 1e9 + 7 进行取模的,根据欧拉定理(其中 a 和 p 互质),根据本题来说那就是
所以 2n %1e9+7就可以进行变形成,变成这样,那么指数就是肯定小于1e9 + 7 了,那么就可以使用快速幂来计算了。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7; inline long long fast_pow(long long a, int n){
long long res = 1L;
while(n){
if(n&1) res = res * a % mod;
n >>= 1;
a = a * a % mod;
}
return res;
} int main(){
string s;
while(cin >> s){
long long ans = 0;
for(int i = 0; i < s.size(); ++i)
ans = (ans * 10 + s[i] - '0') % (mod - 1);
ans = (ans - 2 + mod) % (mod - 1);
cout << (fast_pow(2, ans) + fast_pow(4, ans)) % mod << endl;
}
return 0;
}
SARS病毒 (生成函数 + 快速幂)的更多相关文章
- HDU 2065 "红色病毒"问题 ——快速幂 生成函数
$A(x)=1+x^2/2!+x^4/4!...$ $A(x)=1+x^1/1!+x^2/2!...$ 然后把生成函数弄出来. 暴力手算. 发现结论. 直接是$4^{n-1}+2^{n-1}$ 然后快 ...
- Bzoj4818:生成函数 快速幂
转来的题面:首先这题显然补集转化,就是用全部方案减去不含任何质数的方案.然后怎么做呢?考虑m比较小,我们能大力把<=m的质数全都筛出来.发现n很大,要么倍增要么快速幂......发现p相当小,所 ...
- hdu 2065 "红色病毒"问题(快速幂求模)
n=1 --> ans = 2 = 1*2 = 2^0(2^0+1) n=2 --> ans = 6 = 2*3 = 2^1(2^1+1) n=3 --> ans = 20 ...
- BZOJ4818 [SDOI2017]序列计数 【生成函数 + 快速幂】
题目 Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ,这n个数中,至少有一个数是质数.Alice想知道,有多少个序列满足她的要求. ...
- 【指数型母函数+非递归快速幂】【HDU2065】"红色病毒"问题
大一上学完数分上后终于可以搞懂指数型母函数了.. 需要一点关于泰勒级数的高数知识 题目在此: "红色病毒"问题 Time Limit: 1000/1000 MS (Java/Oth ...
- 【XSY2612】Comb Avoiding Trees 生成函数 多项式求逆 矩阵快速幂
题目大意 本题的满二叉树定义为:不存在只有一个儿子的节点的二叉树. 定义一棵满二叉树\(A\)包含满二叉树\(B\)当且经当\(A\)可以通过下列三种操作变成\(B\): 把一个节点的两个儿子同时删掉 ...
- 2018.12.31 bzoj3992: [SDOI2015]序列统计(生成函数+ntt+快速幂)
传送门 生成函数简单题. 题意:给出一个集合A={a1,a2,...as}A=\{a_1,a_2,...a_s\}A={a1,a2,...as},所有数都在[0,m−1][0,m-1][0,m− ...
- 【bzoj3684】 大朋友和多叉树 生成函数+多项式快速幂+拉格朗日反演
这题一看就觉得是生成函数的题... 我们不妨去推下此题的生成函数,设生成函数为$F(x)$,则$[x^s]F(x)$即为答案. 根据题意,我们得到 $F(x)=x+\sum_{i∈D} F^i(x)$ ...
- hdu2065"红色病毒"问题(指数母函数+快速幂取模)
"红色病毒"问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
随机推荐
- Spring框架IOC和AOP介绍
说明:本文部分内容参考其他优秀博客后结合自己实战例子改编如下 Spring框架是个轻量级的Java EE框架.所谓轻量级,是指不依赖于容器就能运行的.Struts.Hibernate也是轻量级的. 轻 ...
- Linux 系统信息查询大全
Linux常用系统命令 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /etc/redhat-release ...
- CentOS7编译安装libc++和libc++abi
本文介绍了如何在CentOS 7中构建C++11构建环境 Clang的定制C++库是libc++(libcxx).然后,libcxx还需要一个ABI库,libc++abi(libcxxabi).不幸的 ...
- openat与open的区别及用法示例
从2.6.16版本开始,GNU/Linux引入opeant系统调用: #define _XOPEN_SOURCE 700 /* Or define _POSIX_C_SOURCE >= 2008 ...
- java中拦截器与过滤器之间的区别
过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法u ...
- SVN常用命令--Mac端【转载】
* 版本库布局 1. trunk主干 trunk就是开发的主线,一般项目都是导入到主线来开发的. 2. branches分支 branches一般是trunk某个版本的拷贝,如果你想在某一段时间单独对 ...
- ubuntu 忘记密码如何 修改密码
ubuntu 忘记密码如何 修改密码 这个链接讲的很不错 https://blog.csdn.net/zd147896325/article/details/81664558 本来我只是玩一玩,但是我 ...
- [Vue]vue-router的push和replace的区别
1.this.$router.push() 描述:跳转到不同的url,但这个方法会向history栈添加一个记录,点击后退会返回到上一个页面. 2.this.$router.replace() 描述: ...
- java怎么解除文件占用(Dom4j操作完xml后怎么关流)
一.背景 项目中要解析xml,由于Dom4j的诸多优点,我就用Dom4j解析xml,代码如下: public void readXML() { SAXReader reader = new SAXRe ...
- php--最新正则(手机号码)
这次给大家带来正则验证(2018最新最全手机号验证),正则验证(2018最新最全手机号验证)的注意事项有哪些,下面就是实战案例,一起来看一下. 下面给大家分享2018手机号正则表达式验证方法,具体内容 ...
前面那个是AC的,后面那个是GT的,这样列出来之后,就只要算出
这一项的系数就是答案了。


求出
,结果看起来很简单啊,但是 n 实在是太大了啊,所以还需要对 n 进行处理。
(其中 a 和 p 互质),根据本题来说那就是 
,变成这样,那么指数就是肯定小于1e9 + 7 了,那么就可以使用快速幂来计算了。