COGS2259 异化多肽
听说是多项式求逆的模板题,以后不怕没地方练多项式求逆啦哈哈……
……
我们设使用一个氨基酸能组成质量为$n$的多肽数量这个数列为$\{a_n\}$,设它的生成函数为$A(x)$,显然有
\begin{align}A(x)=\sum_{i=0}^\infty \sum_{j=0}^m[C_j=i]\end{align}
即$A(x)$的$i$次方系数即为相对分子质量为$i$的氨基酸数量。
我们要求的是一个数列${b_n}$,它的第$n$项即为使用任意数目的氨基酸能组成质量为$n$的多肽数量,设它的生成函数为$B(x)$,那么有
\begin{align}A(x)=\sum_{i=0}^\infty B(x)^i\end{align}
右边化成封闭形式,得
\begin{align}A(x)=\frac 1{1-B(x)}\end{align}
多项式求逆即可,答案即为$[x^n]A(x)$。顺便一提,1005060097的原根是5。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=,p=,g=;
void NTT(int*,int,int);
void getinv(int*,int*,int);
int qpow(int,int,int);
int n,m,N=,x,A[maxn]={},B[maxn];
int main(){
freopen("polypeptide.in","r",stdin);
freopen("polypeptide.out","w",stdout);
scanf("%d%d",&n,&m);
while(N<=n)N<<=;
while(m--){
scanf("%d",&x);
A[x]=(A[x]+p-)%p;
}
A[]=(A[]+)%p;
getinv(A,B,N);
printf("%d",B[n]);
return ;
}
void NTT(int *A,int n,int tp){
for(int i=,j=,k;i<n-;i++){
k=n;
do j^=(k>>=);while(j<k);
if(i<j)swap(A[i],A[j]);
}
for(int k=;k<=n;k<<=){
int wn=qpow(g,(tp>?(p-)/k:(p-)/k*(long long)(p-)%(p-)),p);
for(int i=;i<n;i+=k){
int w=;
for(int j=;j<(k>>);j++,w=(long long)w*wn%p){
int a=A[i+j],b=(long long)w*A[i+j+(k>>)]%p;
A[i+j]=(a+b)%p;
A[i+j+(k>>)]=(a-b+p)%p;
}
}
}
if(tp<){
int inv=qpow(n,p-,p);
for(int i=;i<n;i++)A[i]=(long long)A[i]*inv%p;
}
}
void getinv(int *A,int *C,int n){
static int B[maxn];
fill(C,C+n,);
C[]=qpow(A[],p-,p);
for(int k=;k<=n;k<<=){
copy(A,A+k,B);
fill(B+k,B+(k<<),);
NTT(B,k<<,);
NTT(C,k<<,);
for(int i=;i<(k<<);i++)C[i]=C[i]*((-((long long)B[i]*C[i]%p)+p)%p)%p;
NTT(C,k<<,-);
fill(C+k,C+(k<<),);
}
}
int qpow(int a,int b,int p){
int ans=;
for(;b;b>>=,a=(long long)a*a%p)if(b&)ans=(long long)ans*a%p;
return ans;
}
其实我对NTT和生成函数只是刚入门而已……我们的征途是星辰大海……
COGS2259 异化多肽的更多相关文章
- [Nescafé41]异化多肽(多项式求逆元)
2015年的题,应该是将形式幂级数引入国内的元老级题目. 大意:给定一个大小为m的正整数序列和n,问有多少种选法可以凑成n,每个数可以选多次,种类不同算不同方案.$n,m,C \leqslant 10 ...
- COGS 2259 异化多肽——生成函数+多项式求逆
题目:http://cogs.pro:8080/cogs/problem/problem.php?pid=2259 详见:https://www.cnblogs.com/Zinn/p/10054569 ...
- COGS 2259 异化多肽 —— 生成函数+多项式求逆
题目:http://cogs.pro:8080/cogs/problem/problem.php?pid=2259 如果构造生成函数是许多个 \( (1+x^{k}+x^{2k}+...) \) 相乘 ...
- AHOI2018训练日程(3.10~4.12)
(总计:共90题) 3.10~3.16:17题 3.17~3.23:6题 3.24~3.30:17题 3.31~4.6:21题 4.7~4.12:29题 ZJOI&&FJOI(6题) ...
- CodeForces 632E Thief in a Shop
题意:给你n种物品,每种无限个,问恰好取k个物品能组成哪些重量.n<=1000,k<=1000,每种物品的重量<=1000. 我们搞出选取一种物品时的生成函数,那么只要对这个生成函数 ...
- 基于tomcat与Spring的实现差异化配置方案
起因 在实际开发过程中经常需要加载各种各样的配置文件..比如数据库的用户名密码,要加载的组件,bean等等..但是这种配置在各个环境中经常是不一样的....比如开发环境和测试环境,真实的生产环境.. ...
- (转)iOS Wow体验 - 第三章 - 用户体验的差异化策略
本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第三章译文精选,其余章节将陆续放出.上一篇:Wow ...
- Android Gradle基于参数化配置实现差异化构建
一.背景: 项目中有一些特殊的需求,如个别渠道集成腾讯bugly,个别渠道集成易观统计,不同的渠道集成不同的推送策略(如Oppo渠道优先Opush推送),不同的渠道拥有不同的第三方登录集成等等.这些需 ...
- Bing词典vs有道词典比对测试报告——功能篇之辅助功能,差异化功能及软件的效能
1.辅助功能: 和有道相比,必应的词典加入了换肤功能,用户可以选择喜欢的颜色,而且必应的皮肤也比较多,这一点设计给必应增色不少. 相对而言,有道则加入了调节客户端字体的大小,如下,也比较人性化 2.差 ...
随机推荐
- IOS开发之——objectForKey与valueForKey在NSDictionary中的差异
从 NSDictionary 取值的时候有两个方法,objectForKey: 和 valueForKey:,这两个方法具体有什么不同呢? 先从 NSDictionary 文档中来看这两个方法的定义: ...
- Kettle导入数据到Hive 出现多余的几行全部是null值的情况
Kylin构建Cube的时候老是报错,说是有空值,其实源数据中是不存在空值的.为什么建Cube的时候会有呢? 执行完毕后使用Hive查询发现多了好几行全部是null的行. 这在源数据中是不存在的.分析 ...
- jvm内存分部
首先我们必须要知道的是 Java 是跨平台的.java常用的名词有jdk,jre,jvm jdk包括后两者,是开发者工具集, jre表示java运行环境, jvm是java虚拟机,是java夸平台的保 ...
- MySQL8,登陆root后修改root密码的正确方式
如题,·MySQL8以上的修改密码方式和5不一样 网上搜到的无用答案很多,这里记一下版本8的正确修改方式,也方便自己和他人 USE mysql; ALTER user 'root'@'%' IDENT ...
- 认识CSS中布局之文档流、浮动、定位以及叠放次序
前端之HTML,CSS(七) CSS CSS布局的核心就是盒子的摆放,即CSS定位.而CSS中定位机制分为:普通流(nomal flow).浮动(float).定位(position). 普通流 普通 ...
- Spring异常:Annotation-specified bean name.. for bean class ...
Spring重命名问题.对照项目中的注解,查找@Service是否重重名.由于Spring是在注解下按配置扫描的方式去创建对象的,那么两个重名的注解也就不成立了. 备注,特别注意test包下有没有通过 ...
- SQL端通过脚本判断文件夹是否存在 并创建
做数据库备份作业的时候..想按日期建立文件夹.. 首先要判断文件夹是否存在 ) --路径 ) --日期 例如: 20171011 SET @DATE=CAST(DATEPART(YYYY,GETDAT ...
- openerp学习笔记 日期时间相关操作
日期格式化字符串:DATE_FORMAT = "%Y-%m-%d" 日期时间格式字符串:DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S" ...
- selenium+junit4实现参数化自动化测试
业务场景:在www.1905.com电影网中实现两个用户的登陆操作. 代码如下: package com.m1905.junit; import java.util.Arrays; import ja ...
- 026-log4j配置文件模板
模板一: ### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender lo ...