当前位置: 首页 > 编程日记 > 正文

洛谷P4705 玩游戏(生成函数+多项式运算)

题面

传送门

题解

妈呀这辣鸡题目调了我整整三天……最后发现竟然是因为分治\(NTT\)之后的多项式长度不是\(2\)的幂导致把多项式的值存下来的时候发生了一些玄学错误……玄学到了我\(WA\)的点全都是\(WA\)\(2\)的幂次行里……

看到这种题目二话不说先推倒

\[ \begin{aligned} [x^k]Ans &={1\over nm}\sum_{i=1}^n\sum_{j=1}^m\left(a_i+b_j\right)^k\\ &={1\over nm}\sum_{i=1}^n\sum_{j=1}^m\sum_{p=0}^k{k\choose p}{a_i}^p{b_j}^{k-p}\\ &={k!\over nm}\sum_{p=0}^k{\sum_{i=1}^n{a_i}^p\over p!}{\sum_{j=1}^m{b_j}^{k-p}\over (k-p)!}\\ \end{aligned} \]

然后这就被画成了一个卷积的形式

定义两个多项式\(A(x)=\sum_{i=0}^\infty x^i\sum_{j=1}^n{a_j}^i\),和\(B(x)=\sum_{i=0}^\infty x^i\sum_{j=1}^m{b_j}^i\),只要我们能求出这两个多项式的系数,然后一通乱搞之后就能求出\(Ans\)

然后继续推倒

\[ \begin{aligned} A(x) &=\sum_{i=0}^\infty x^i\sum_{j=1}^n{a_j}^i\\ &=\sum_{j=1}^n\sum_{i=0}^\infty {a_j}^ix^i\\ &=\sum_{i=1}^n{1\over 1-a_ix}\\ &=\sum_{i=1}^n {a_i}^0+{a_i}^1x^1+{a_i}^2x^2+... \end{aligned} \]

所以……这玩意儿该咋算啊……

我们设

\[ \begin{aligned} G(x) &=\sum_{i=1}^n{-a_i\over 1-a_ix}\\ &=\sum_{i=1}^n-{a_i}^1-{a_i}^2x-{a_i}^3x^2-...\\ \end{aligned} \]

那么就有\(A(x)=-xG(x)+n\)

然而我还是不会算\(G\)啊……

那就继续推倒

\[ \begin{aligned} G(x) &=\sum_{i=1}^n{-a_i\over 1-a_ix}\\ &=\sum_{i=1}^n\ln'\left(1-a_ix\right)\\ &=\ln'\left(\prod_{i=1}^n (1-a_ix)\right) \end{aligned} \]

分治\(NTT\)就行啦

然后没有然后了

我错了多项式比计算几何难调多了

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){R int res,f=1;R char ch;while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R int x){if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;while(z[++Z]=x%10+48,x/=10);while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=(1<<18)+5,P=998244353,Gi=332748118;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){R int res=1;for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);return res;
}
vector<int>r[21];int rt[2][N<<1],inv[N],fac[N],ifac[N],lim,d;
inline void init(R int len){lim=1,d=0;while(lim<len)lim<<=1,++d;}
void Pre(){fp(d,1,18){r[d].resize(1<<d);fp(i,1,(1<<d)-1)r[d][i]=(r[d][i>>1]>>1)|((i&1)<<(d-1));}inv[0]=inv[1]=fac[0]=fac[1]=ifac[0]=ifac[1]=1;fp(i,2,262144){fac[i]=mul(fac[i-1],i),inv[i]=mul(P-P/i,inv[P%i]),ifac[i]=mul(ifac[i-1],inv[i]);}for(R int t=(P-1)>>1,i=1,x,y;i<=262144;i<<=1,t>>=1){x=ksm(3,t),y=ksm(Gi,t);rt[1][i]=rt[0][i]=1;fp(k,1,i-1){rt[1][k+i]=mul(rt[1][k+i-1],x),rt[0][k+i]=mul(rt[0][k+i-1],y);}}
}
int rev[N];
void NTT(int *A,int ty){fp(i,0,lim-1)if(i<r[d][i])swap(A[i],A[r[d][i]]);for(R int mid=1;mid<lim;mid<<=1)for(R int j=0;j<lim;j+=(mid<<1))for(R int k=0,t;k<mid;++k)A[j+k+mid]=dec(A[j+k],t=mul(rt[ty][mid+k],A[j+k+mid])),A[j+k]=add(A[j+k],t);if(!ty)for(R int i=0,inv=ksm(lim,P-2);i<lim;++i)A[i]=mul(A[i],inv);
}
void Inv(int *a,int *b,int len){if(len==1)return b[0]=ksm(a[0],P-2),void();Inv(a,b,len>>1),init(len<<1);static int A[N],B[N];fp(i,0,len-1)A[i]=a[i],B[i]=b[i];fp(i,len,lim-1)A[i]=B[i]=0;NTT(A,1),NTT(B,1);fp(i,0,lim-1)A[i]=mul(A[i],mul(B[i],B[i]));NTT(A,0);fp(i,0,len-1)b[i]=dec(add(b[i],b[i]),A[i]);fp(i,len,lim-1)b[i]=0;
}
void Ln(int *a,int *b,int len){static int A[N],B[N];fp(i,1,len-1)A[i-1]=mul(a[i],i);A[len-1]=0;Inv(a,B,len),init(len<<1);fp(i,len,lim-1)A[i]=B[i]=0;NTT(A,1),NTT(B,1);fp(i,0,lim-1)A[i]=mul(A[i],B[i]);NTT(A,0);fp(i,1,len-1)b[i]=mul(A[i-1],inv[i]);b[0]=0;fp(i,len,lim-1)b[i]=0;
}
int D[25][N];
void solve(int *a,int d,int l,int r){if(l==r)return D[d][0]=1,D[d][1]=P-a[l],void();int mid=(l+r)>>1;solve(a,d,l,mid),solve(a,d+1,mid+1,r),init(r-l+1+1);static int A[N],B[N];fp(i,0,mid-l+1)A[i]=D[d][i];fp(i,mid-l+2,lim-1)A[i]=0;fp(i,0,r-mid)B[i]=D[d+1][i];fp(i,r-mid+1,lim-1)B[i]=0;NTT(A,1),NTT(B,1);fp(i,0,lim-1)A[i]=mul(A[i],B[i]);NTT(A,0);fp(i,0,r-l+1)D[d][i]=A[i];fp(i,r-l+2,lim-1)D[d][i]=0;
}
int a[N],b[N],ak[N],bk[N];
int n,m,t;
void calc(int *a,int *b,int n,int t){static int A[N],B[N];solve(a,1,1,n);init(t+1);int len=lim;fp(i,0,n)A[i]=D[1][i];fp(i,n+1,len-1)A[i]=0;Ln(A,B,len);fp(i,1,len-1)B[i-1]=mul(B[i],i);B[len-1]=0;b[0]=n;fp(i,1,t)b[i]=mul(P-B[i-1],ifac[i]);
}
void Mul(int *a,int *b){init(t<<1);NTT(a,1),NTT(b,1);fp(i,0,lim-1)a[i]=mul(a[i],b[i]);NTT(a,0);int invm=ksm(mul(n,m),P-2);fp(i,1,t)print(1ll*a[i]*fac[i]%P*invm%P);
}
int main(){
//  freopen("testdata.in","r",stdin);Pre();n=read(),m=read();fp(i,1,n)a[i]=read();fp(i,1,m)b[i]=read();t=read();calc(a,ak,n,t),calc(b,bk,m,t);Mul(ak,bk);return Ot(),0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10548277.html

相关文章:

blast程序 介绍 简介

每次找都挺麻烦&#xff0c;又记不住&#xff0c;于是抄下来&#xff1a; blastp:将待查询的蛋白质序列及其互补序列一起对蛋白质序列数据库进行查询&#xff1b;blastn:将待查询的核酸序列及其互补序列一起对核酸序列数据库进行查询&#xff1b;blastx:先将待查询的核酸序列按…

java泛型的实现和原理_java 泛型实现原理

泛型思想最早在C语言的模板(Templates)中产生&#xff0c;Java后来也借用了这种思想。虽然思想一致&#xff0c;但是他们存在着本质性的不同。C中的模板是真正意义上的泛型&#xff0c;在编译时就将不同模板类型参数编译成对应不同的目标代码&#xff0c;List和List是两种不同的…

java out of range_关于Parameter index out of range求解决办法

程序&#xff1a;提示参数越界&#xff0c;但我实在不知道我到底哪里越界了。明明该我那样写的嘛。求高手帮我看看&#xff0c;现在我是弄得我有气无力了&#xff01;要死了。在去死亡的路上等着你帮帮我&#xff01;Document : replyokCreated on : 2008-9-29, 6:05:31Autho…

FineReport——权限分配以及自定义首页

权限分配可以有两种方法&#xff0c;第一种方法是根据部门职位分配权限&#xff0c;第二种是根据角色分配权限&#xff1b; FR自带有三个JQ对象&#xff0c;用以保存用户名参数/角色参数/部门参数——$fr_username/$fr_authority/$fr_userposition 根据部门职位&#xff1a; 以…

去掉[]中的英文(正则表达式)C#

这个问题本来是以为信息科技大学的老师问蒋委员长的问题,蒋委员长用正则表达式完成了这个问题 1,问题的情况有哪些? abc[abc]abc,abc[-abc]abc,abc[一abc]abc,abc[一abc一]abc等等. 2,问题的解决目标? 写一个通用的方法来完成提出的问题. 3,解决方案 -->正则表达式方法 其…

Event Loop

事件队列 Javascript是单线程&#xff0c;单线程就意味着所有任务需要排队。然后会将所有任务分成两类&#xff1a;同步任务和异步任务&#xff01;同步任务&#xff1a;在主线程上执行的任务&#xff0c;只有前一个任务执行完成&#xff0c;才会执行后一个&#xff01;异步任务…

java makefile jar包_java makefile学习实践(编译的javac命令写在makefile中,运行命令java写在shell脚本中)...

学习makefile教程&#xff0c;ubuntu中文网1.写一个简单的java项目&#xff0c;不需要外部jar,用的简单的importjava.util.ArrayList;是可以从CLASSPATH环境变量中找到的&#xff0c;在javac阶段不需要特殊添加-cphellocatHellocat.javaimportjava.util.ArrayList;importjava.u…

Python字符编码详解

Python字符编码详解 转自http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html Python字符编码详解 本文简单介绍了各种常用的字符编码的特点&#xff0c;并介绍了在python2.x中如何与编码问题作战 &#xff1a;&#xff09; 请注意本文关于Python的内容仅适用于2.x&a…

《编写有效用例》读书笔记1

第一章 引言 本章主要介绍用例是什么样子的&#xff0c;并描述为什么不同的项目组需要采用不同 的用例编写风格以及在什么地方使用用例有利于做需求收集工作&#xff0c;也让我们了解 在编写用例之前&#xff0c;需要做哪些准备工作。 用例是代表系统中各个项目相关人员之间就系…

顺序结构,判断结构 if,switch

1&#xff1a;顺序结构&#xff1a;从上往下执行程序代码&#xff0c;为顺序结构 ---------------------------------------------------------------------- 2&#xff1a;判断结构&#xff1a; if 如果 判断是两个选择一个&#xff0c;要么对要么错 if中的条件表达式 返回…

php转换文字Unicode,php实现将中文转为unicode的方法

相关函数说明&#xff1a;iconv命令是用来转换文件的编码方式的&#xff0c;比如它可以将UTF8编码的转换成GB18030的编码&#xff0c;反过来也行。str_split() 函数把字符串分割到数组中。bin2hex() 函数把 ASCII 字符的字符串转换为十六进制值。字符串可通过使用 pack() 函数再…

kail安装和vmtools安装

因位太费劲我直接把我做的Word文档直接上传了&#xff0c;如果想安装可以下载&#xff0c;我就不麻烦在写一遍了&#xff0c;这个教程主要给小白讲的&#xff0c;大佬请绕过 kail安装教程.docx https://pan.wps.cn/l/sm43o7f 密码&#xff1a;f43341转载于:https://www.cnblogs…

Windows计数器做性能监控(window server 2008服务器)

使用Windows计数器 一、创建数据收集器集 二、创建数据收集器 三、使用数据收集器 1、修改数据收集器的属性 2、手动启用、手动停止数据收集器集 3、计划任务 4、在性能监视器中查看 一、性能监视器 Windows 服务器操作系统提供一个名为“性能监视器”的图形工具&#xff0c;可…

使用浏览器wpf应用程序时访问数据库需要报权限错误的解决方法

在这篇wpf教程中&#xff0c;如果选用浏览器wpf应用程序模板我遇到了 访问数据库时权限不够 不能打开连接 将项目属性的安全性中设置为完全信任后即解决 转载于:https://www.cnblogs.com/langu/archive/2012/03/29/2423620.html

gprs 神奇宝典java,2016联通笔试知识点大全

答&#xff1a;呼叫转移是指用户在工作忙或手机无网络等无法用本机接听电话的情况下&#xff0c;即可将来电设置呼叫转移到另一个号码上&#xff0c;实现号码转移。注&#xff1a;呼叫转移业务目前无需月功能费&#xff0c;用户设置呼叫转移后&#xff0c;如正常接听来电则按照…

内存管理器(二)边界标识法

边界标识算法 前言 首先说明&#xff0c;我们这里的内存管理器主要是以模拟各种内存分配算法为主&#xff0c;从内存申请一片内存然后根据我们所选定的数据结构和算法&#xff0c;实现程序的堆空间的分配&#xff0c;至于内存分配详情我们会在Linux内核内存管理的简单分析中探讨…

XDOC Office Server 开源了,Office文档完美转换为PDF

百度智能云 云生态狂欢季 热门云产品1折起>>> 项目地址&#xff1a;https://gitee.com/xdoc/xoffice XDOC是一个文档自动化平台&#xff0c;提供免费的Office文档生成服务。有用户提出要PDF格式&#xff0c;便于阅读、发布。在尝试了OpenOffice、WPS、微软Office、P…

js的defer属性

js的defer属性说明&#xff1a;<script src"js.js" type"text/javascript defer"defer"/>中defer的作用 给外链的js脚本添加defer"defer" 或 defer"true",使用defer属性可以让脚本在整个页面装载完成之后再解析&#xff0c…

怎么读取java文件,Java怎么读取文件

当前位置:我的异常网 J2SE Java怎么读取文件Java怎么读取文件www.myexceptions.net 网友分享于&#xff1a;2013-12-20 浏览&#xff1a;60次Java如何读取文件?源文件如下,小弟没有学过Java,下面是一段JAVA用RSA加密字符串的程序,命令行的形式是Java PublicExample ABC…

Android环境变量的设置(详细图解版)

Android环境变量的设置&#xff08;详细图解版&#xff09; 转载于:https://www.cnblogs.com/zhujiabin/p/4875182.html

用加密货币连接业务的6种方法

如今&#xff0c;区块链技术和加密货币已经变得更加接近传统业务。在某些情况下&#xff0c;商人们能够找到一种将传 统商业与新技术相结合的有价值的模式。事实上&#xff0c;进入加密货币市场有很多选择&#xff0c;本文将讨论6种主 要的合作方式。 创建加密货币平台是为了完…

extjs grid renderer用法

renderer可以格式化该列显示的数据格式或者按照你自定义的脚本显示最终数据样子&#xff08;我目前是这么理解的&#xff09; 先看下renderer: function()里的参数 var cm new Ext.grid.ColumnModel([new Ext.grid.RowNumberer(),sm,{header:商品名称, dataIndex: name,render…

java50车架适合身高,【经验分享】身高与车架的选择

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼车架的长度&#xff1a;骑在车上&#xff0c;在正常握把时&#xff0c;眼睛、把立前端和前轮花鼓三点一线则说明车架长度正好&#xff0c;否则可通过更换不同长度的把立来调整长度。在Airborne网站上看到了度量身体个部位长度和计算…

从Android界面开发谈起(转)

原文地址&#xff1a;http://blog.csdn.net/nieweilin/article/details/5967815 这篇文章没有打算有一个很好的逻辑去介绍android的某个方面&#xff0c;全盘大致上就是我接触、了解android的ui开发后到现在的一些感想以及个人理解吧&#xff01; 全文可能会涉及到java、androi…

Android笔记之使用LocationManager获取经纬度

LocationManager.getLastKnownLocation(String provider)有可能返回null&#xff0c;概率还挺高 findViewById(R.id.llMain).setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {AndPermission.with(MainActivity.this).runtime().permissi…

Java虚拟机类加载机制

虚拟机类加载机制&#xff1a;虚拟机把描述类的数据从class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型。 Java语言里&#xff0c;类型的加载和连接过程是在程序运行期间完成的。 类的生命周期&#xff…

dw8与mysql的连接,VS2019连接mysql8.0数据库的教程图文详解

1.首先准备好vs2019以及mysql数据库&#xff0c;两者都可以去官网下载&#xff0c;我们直接描述连接过程。2.连接&#xff1a;第一步&#xff1a;打开mysql的安装目录&#xff0c;我本地的安装目录如下&#xff1a;(注意是否有include和lib文件夹)第二步&#xff1a;打开vs2019…

IOS中打开应用实现检查更新的功能

//检查更新页面- (void)Renew{ NSDictionary *infoDic [[NSBundle mainBundle]infoDictionary]; NSString *version [infoDic valueForKey:"CFBundleShortVersionString"]; NSString *ipstr [NSObject deviceIPAdress]; NSString *p…

CSS3边框背景-边框背景(-border-image)

另一个令人兴奋的新特征是边框图片。有了这项功能您可以定义一个图像被用来代替正常的边框的一个组成部分。这项功能实际上是分成了几个属性&#xff1a;边框和边框角的形象。这两个值是&#xff1a; border-image: border-top-imageborder-right-imageborder-bottom-imagebord…

Promise的实例用法

设定函数 function chiFan() {return new Promise(function(resolve, reject) {console.log("chiFan");}) }function shuiJiao() {return new Promise(function(resolve, reject) {console.log("shuiJiao");}) }function daDouDou() {return new Promise(f…