uoj#420. 【集训队作业2018】矩形(组合数学)
题面
题解
这辣鸡题目做了咱整整三天……咱果然还是太菜了……好珂怕的推倒啊……
首先把它变成
\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\)
我们对它的系数求和,就是
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}
\]
记
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\)的系数了
那么继续推倒
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\),就移项解方程。于是
{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\)的系数就是就是
\]
总的系数就是
\]
我们记\(G(x,y)=h^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\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\)(咱因为没发现这个细节卡了好久)
继续推倒
\]
我们对这个东西求一个和,也就是记\(T(x)=\sum_{y=1}^m G(x,y)\),有
\]
虽然最后的\(h^y\)的求和还要特判一下\(h=1\)的情况不过想必大家都是明白的我就不写了
中间那一大坨是什么东西啊……回过头去看看……
\(\sum_{j=0}^{m-1}b^jh^j{i+j\choose j}\)不等于\(g_i\)么……
\]
还是分类讨论,如果\(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;
}
uoj#420. 【集训队作业2018】矩形(组合数学)的更多相关文章
- uoj #450[集训队作业2018]复读机
传送门 \(d=1\),那么任何时刻都可以\(k\)个复读机的一种,答案为\(k^n\) \(d>1\),可以枚举某个复读机的复读次数(必须是\(d\)的倍数),然后第\(i\)个复读时间为\( ...
- UOJ 422 [集训队作业2018] 小Z的礼物 min-max容斥 期望 轮廓线dp
LINK:小Z的礼物 太精髓了 我重学了一遍min-max容斥 重写了一遍按位或才写这道题的. 还是期望多少时间可以全部集齐. 相当于求出 \(E(max(S))\)表示最后一个出现的期望时间. 根据 ...
- UOJ #449. 【集训队作业2018】喂鸽子
UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...
- 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)
[UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...
- 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)
[UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...
- UOJ#418. 【集训队作业2018】三角形
#418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...
- UOJ#422. 【集训队作业2018】小Z的礼物
#422. [集训队作业2018]小Z的礼物 min-max容斥 转化为每个集合最早被染色的期望时间 如果有x个选择可以染色,那么期望时间就是((n-1)*m+(m-1)*n))/x 但是x会变,中途 ...
- UOJ#428. 【集训队作业2018】普通的计数题
#428. [集训队作业2018]普通的计数题 模型转化好题 所以变成统计有标号合法的树的个数. 合法限制: 1.根标号比子树都大 2.如果儿子全是叶子,数量B中有 3.如果存在一个儿子不是叶子,数量 ...
- uoj450 【集训队作业2018】复读机(生成函数,单位根反演)
uoj450 [集训队作业2018]复读机(生成函数,单位根反演) uoj 题解时间 首先直接搞出单个复读机的生成函数 $ \sum\limits_{ i = 0 }^{ k } [ d | i ] ...
- [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥
题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...
随机推荐
- debug的时候出现停在ThreadPoolexecutor.class文件中停留的解决办法
原因: The posted stack trace indicates that a RuntimeException was encountered in a Daemon thread. Thi ...
- java代码流类。。程序怎么跟书上的结果不一样???
总结:这个程序很容易懂.的那是这个结果我觉得有问题啊..怎么“stop”后,输出的内容是输入过的呢? 应该是没有关系的呀,与输入的值是不同的....怎么书上运行的结果和我的不一样啊 package c ...
- L2-023. 图着色问题(暴力)
L2-023. 图着色问题 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 图着色问题是一个著名的NP完全问题.给定无向图 G ...
- spring boot 学习10 定义springboot的两种方法
使用spring boot的两种方法: A:继承spring-boot-starter-parent项目 这种方式很简单,只需要在POM里面添加parent父工程即可. B: 如果你不喜欢继承spri ...
- IC卡和RFID卡的区别(网上说的都不准确)
其实IC卡是卡类型的称呼,IC卡和RFID卡不应该在一起对比的,和IC卡在一起对比的应该是ID卡. RFID卡是其实是对卡技术类型称呼. IC为卡类型称呼(Integrated Circuit Car ...
- [Chapter 3 Process]Practice 3.2 Including the initial parent process, how many processes are created by the program shown in Figure?
3.2 Including the initial parent process, how many processes are created by the program shown in Fig ...
- javascript——对象的概念——创建对象与销毁对象
一.创建对象 1.创建空对象 方式一: var o ={};o; //Object {} typeof(o); //"object" 方式二: var o=new Object() ...
- easyui中 combogrid控件的loadData方法加载本地数据
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 解决实现OnPageChangeListener()接口的方法参数出现arg0,arg1的现象
在安卓开发中,我们经常用到ViewPager,那么既然用到ViewPager,一般都需要去实现OnPageChangeListener()接口的三个方法. 但是有时候实现的三个方法的参数都变成agr0 ...
- Markdown编辑器及图床推荐
Typora和自动图床工具 Typora 地址 ,极致简洁,界面很漂亮,最重要的是所见即所得 百度云搬运 密码:xi01 自动图床工具 需要七牛云做图床,感谢作者,详见博客 使用方法,只需两步即可完成 ...