题面

传送门

题解

这辣鸡题目做了咱整整三天……咱果然还是太菜了……好珂怕的推倒啊……

首先把它变成

\[\left( \sum_{i = 1}^{n} \sum_{j = 1}^{m} F(i, j) \, h^{im + j} \right) \bmod p\]

那么最后求答案的时候乘上的\({1\over h^{m+1}}\)就行了

我们考虑对\(v\)(即题目中的\(f_i\))和\(c\)分别计算贡献

\(sub_1\)

对于\(v_x\),打个表可以发现,第\(x\)行第\(1\)列它的系数为\(b\),第\(2\)列系数为\(b^2\),以及第\(x+i\)行第\(j\)列的系数为\({i+j-1\choose j-1}a^ib^jh^{(i+x)m}h^j\)

我们对它的系数求和,就是

\[ \begin{aligned} cnt &=\sum_{i=0}^{n-x}a^ih^{(i+x)m}\sum_{j=1}^{m}{i+j-1\choose j-1}b^{j}h^{j}\\ &=bh^{xm+1}\sum_{i=0}^{n-x}a^ih^{im}\sum_{j=0}^{m-1}{i+j\choose j}b^{j}h^{j}\\ \end{aligned} \]


\[ \begin{aligned} f_n=\sum_{i=0}^na^ih^{im}\sum_{j=0}^{m-1}{i+j\choose j}b^{j}h^{j}\\ g_n=\sum_{j=0}^{m-1}{n+j\choose j}b^{j}h^{j}\\ \end{aligned} \]

于是我们显然可以写出\(f_n\)的递推式\(f_n=f_{n-1}+a^nh^{nm}g_n\)

那么我们只要能搞出\(g\)就可以求出\(f\),进而求出每个\(v_x\)的系数了

那么继续推倒

\[ \begin{aligned} g_n &=\sum_{j=0}^{m-1}{n+j\choose j}b^{j}h^{j}\\ &=\sum_{j=0}^{m-1}\left({n+j-1\choose j-1}+{n-1+j\choose j}\right)b^{j}h^{j}\\ &=bh\sum_{j=0}^{m-2}{n+j\choose j}b^{j}h^{j}+\sum_{j=0}^{m-1}{n-1+j\choose j}b^{j}h^{j}\\ &=bh\left(g_n-{n+m-1\choose m-1}b^{m-1}h^{m-1}\right)+g_{n-1} \end{aligned} \]

然后就分类讨论啊,如果\(bh\)等于\(1\),就消掉\(g_n\),可以直接得出\(g_{n-1}\)的式子。如果\(bh\)不等于\(1\),就移项解方程。于是

\[g_n=\begin{cases} {n+m\choose m-1}&bh=1\\ {g_{n-1}+{n+m-1\choose m-1}b^mh^m\over 1-bh}&bh\neq 1 \end{cases} \]

初值分别为\(m(bh=1)\)和\({1-b^mh^m\over 1-bh}(bh\neq 1)\)

然后递推出\(g\),进而求出\(f\),对于每个\(v_x\)乘上\(bh^{xm+1}\)和\(f_{n-x}\)就行了

\(sub_2\)

然后我们考虑\(c\)的贡献

对于位置\((x,y)\),\((i,j)(i\leq x,j\leq y)\)上的每一个\(c\)都会对这一个位置有贡献,我们可以看做向下走一步乘\(a\),向右走一步乘\(b\),\((x,y)\)上\(c\)的系数就是从所有\((i,j)\)走到它的所有路径的权值之和。那么这个位置上\(c\)的系数就是就是

\[F(x,y)=\sum_{i=0}^{x-1}\sum_{j=0}^{y-1}a^ib^j{i+j\choose j}\]

总的系数就是

\[\sum_{x=1}^nh^{xn}\sum_{y=1}^mh^y\sum_{i=0}^{x-1}\sum_{j=0}^{y-1}a^ib^j{i+j\choose j}\]

我们记\(G(x,y)=h^y\sum_{i=0}^{x-1}\sum_{j=0}^{y-1}a^ib^j{i+j\choose j}\)

和上面一样化简。

\[ \begin{aligned} G(x,y) &=h^y\sum_{i=0}^{x-1}\sum_{j=0}^{y-1}a^ib^j\left({i+j-1\choose j-1}+{i-1+j\choose j}\right)\\ &=h^ya\sum_{i=0}^{x-2}\sum_{j=0}^{y-1}a^ib^j{i+j\choose j}+h^yb\sum_{i=0}^{x-1}\sum_{j=0}^{y-2}a^ib^j{i+j\choose j}+h^y \end{aligned} \]

注意,中间把组合数拆开来的时候,这个式子对\({0\choose 0}\)实际上是不适用的,所以我们少算了\({0\choose 0}\)的贡献,所以最后要加上\(h^y\)(咱因为没发现这个细节卡了好久)

继续推倒

\[G(x,y)=aG(x-1,y)+b\left(G(x,y)-h\sum_{i=0}^{x-1}a^ib^{y-1}h^{y-1}{i+y-1\choose y-1}\right)+h^y\]

我们对这个东西求一个和,也就是记\(T(x)=\sum_{y=1}^m G(x,y)\),有

\[T(x)=aT(x-1)+b\left(T(x)-h\sum_{i=0}^{x-1}a^i\sum_{j=0}^{m-1}b^jh^j{i+j\choose j}\right)+{h(1-h^m)\over 1-h}\]

虽然最后的\(h^y\)的求和还要特判一下\(h=1\)的情况不过想必大家都是明白的我就不写了

中间那一大坨是什么东西啊……回过头去看看……

\(\sum_{j=0}^{m-1}b^jh^j{i+j\choose j}\)不等于\(g_i\)么……

\[T(x)=aT(x-1)+b\left(T(x)-h\sum_{i=0}^{x-1}a^ig_i\right)+{h(1-h^m)\over 1-h}\]

还是分类讨论,如果\(b=1\)我们可以直接求出\(T(x-1)\)的通项公式,否则就可以解出\(T(x)\)的递推公式

然后枚举\(x\),每一个\(x\)都要让系数加上\(h^{xm}T(x)\),最后系数乘上\(c\)就行了

搞清楚字母哪个是哪个,别跟咱一样连自己写的啥都不知道了……

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#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;
}
const int N=1e6+15;
int v[N],f[N],g[N],d[N],inv[N],t[N];
int n,m,h,P,a,b,c,res,x,y;
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 ll y){R int res=1;for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);return res;
}
int calc1(){int res=0,tmp;if(mul(b,h)==1){f[0]=g[0]=tmp=m;fp(i,1,n){tmp=1ll*(i+m)%P*tmp%P*inv[i+1]%P;g[i]=tmp;}}else{int p=mul(b,h),q=ksm(p,m);p=ksm(dec(1,p),P-2);tmp=1,f[0]=g[0]=mul(dec(1,q),p);fp(i,1,n){tmp=1ll*(i+m-1)%P*tmp%P*inv[i]%P;g[i]=dec(g[i-1],mul(tmp,q)),g[i]=mul(g[i],p);}}int p=1,k=mul(a,ksm(h,m));fp(i,1,n)p=mul(p,k),f[i]=add(f[i-1],mul(p,g[i]));int x=mul(b,h),y=ksm(h,m);fp(i,1,n)x=mul(x,y),res=add(res,1ll*x*f[n-i]%P*v[i]%P);return res;
}
int calc2(){int res=0,qwq=(h==1)?m%P:1ll*h*dec(1,ksm(h,m))%P*ksm(dec(1,h),P-2)%P;if(b==1){int tmp=g[0],k=1,inva=ksm(a,P-2);fp(i,1,n)k=mul(k,a),tmp=add(tmp,mul(k,g[i])),t[i]=mul(dec(1ll*tmp*h%P*b%P,qwq),inva);}else{int tmp=g[0],k=1,invb=ksm(dec(1,b),P-2);fp(i,1,n){t[i]=mul(a,t[i-1]);t[i]=dec(t[i],1ll*b*h%P*tmp%P);t[i]=add(t[i],qwq);t[i]=mul(t[i],invb);k=mul(k,a),tmp=add(tmp,mul(k,g[i]));}}int g=1,k=ksm(h,m);fp(i,1,n)g=mul(g,k),res=add(res,mul(g,t[i]));return mul(res,c);
}
int main(){
//  freopen("testdata.in","r",stdin);read(),n=read(),m=read(),h=read(),P=read(),a=read(),b=read(),c=read();if(!h)return printf("%d\n",add(c,mul(b,read()))),0;inv[0]=inv[1]=1;fp(i,2,n+5)inv[i]=mul(P-P/i,inv[P%i]);fp(i,1,n)v[i]=read();x=calc1(),y=calc2();res=ksm(h,m+1),res=ksm(res,P-2),res=mul(res,add(x,y));printf("%d\n",res);return 0;
}

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

uoj#420. 【集训队作业2018】矩形(组合数学)相关推荐

  1. uoj#422. 【集训队作业2018】小Z的礼物

    uoj#422. [集训队作业2018]小Z的礼物 题目描述 Solution 所有礼物全部取到的方案数并不好求,因此我们考虑min−maxmin-maxmin−max容斥,转化为第一次取到集合中某一 ...

  2. 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)

    [UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...

  3. UOJ#449. 【集训队作业2018】喂鸽子

    #449. [集训队作业2018]喂鸽子 DP好题 法一:min-max容斥 处理前m个,最快吃饱的鸽子期望的时间 根据期望的定义 考虑每个方案数的概率*期望次数 枚举前m个用了x个,概率都是(1/m ...

  4. UOJ#418. 【集训队作业2018】三角形

    #418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...

  5. UOJ#449. 【集训队作业2018】喂鸽子 min-max容斥,FFT

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ449.html 题解 设 f(i) 表示给 i 只鸽子喂食使得至少一只鸽子被喂饱的期望次数,先 min-max容斥 一下. ...

  6. UOJ#419. 【集训队作业2018】圆形(格林公式)

    题面 传送门 题解 首先您得会用格林公式计算圆的面积并 这里只需要动态维护一下圆弧就可以了 时间复杂度\(O(n^2\log n)\) //minamoto #include<bits/stdc ...

  7. UOJ#450. 【集训队作业2018】复读机 排列组合 生成函数 单位根反演

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ450.html 题解 首先有一个东西叫做"单位根反演",它在 FFT 的时候用到过: ...

  8. 集训队作业2018: 青春猪头少年不会梦到兔女郎学姐(多限制容斥)(生成函数)(组合数学)

    题意 给定 nnn 种颜色的球,第 iii 种颜色的球数量为 aia_iai​ 个,一种排列的贡献可以如下计算:先把这个序列首尾相连,然后把所有相邻且颜色相同的段拿出来,贡献为他们的长度之积,求所有排 ...

  9. uoj#448. 【集训队作业2018】人类的本质(Min_25筛+拉格朗日插值)

    题面 传送门 题解 肝了整整一天--膜拜yww和cx巨巨--(虽然它们的题解里我就没看懂几个字) 请备好草稿纸和笔,这种题目就是需要耐心推倒 题目所求是这么一个东西 \[ \begin{aligned ...

最新文章

  1. TCP/IP 协议栈及 OSI 参考模型详解--云平台技术栈04
  2. 电脑html按键侧滑广告,HTML5侧滑聊天面板
  3. django使用ckeditor富文本编辑器-转
  4. Oracle——15触发器
  5. WGAN-GP与GAN及WGAN的比较
  6. python获取一个月之前日期_Python 获取几天前的时间
  7. 【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术:Direct3D渲染五步曲...
  8. Fatal error: Cannot redeclare db_connect() 错误
  9. LintCode Python 简单级题目 41.最大子数组 - 44.最小子数组和
  10. 将excel文件中的数据导入导出至SQL数据库中(Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0|office2003和office2007)...
  11. 瑞利信道的多普勒谱的原理与MATLAB仿真
  12. VC2012安装Opengl开发环境
  13. 电信光纤友华PT921G,烽火HG220光猫破解关闭自带路由改桥接拨号教程
  14. 第8章 离不开的数据库
  15. PDF编辑器哪个好,如何把PDF文件拆分成多个文件
  16. Flutter shared_preferences简单使用
  17. 使用SharedPreferences保存list
  18. JavaScript DOM操作,就是这么简单!
  19. IE8跳转谷歌浏览器亲测有效
  20. ModelSim: Module is not defined

热门文章

  1. python如何实现下载文件_python实现下载文件的三种方法
  2. TS学习笔记04 JS创建对象的方式
  3. CLAN Studio Toolkits - Icon Creator
  4. docker突然启动失败,重装docker和配置mysql,数据未丢失
  5. Android安卓逆向工程师
  6. 2015武汉大学第八届Eming杯现场赛E题题解
  7. 无线数传采集 开关量输入输出模块 无线控制终端
  8. MariaDB在Linux环境下的安装及使用
  9. 拓嘉辰丰电商:拼多多主图怎样把握方向提高点击
  10. 离散制造与流程制造的区别与特点