luogu-P5320题解
简要题意
设 \(f(n)\) 表示用多米诺骨牌恰好铺满 \(2\times n\) 的平面的方案数,\(g(n)\) 表示用多米诺骨牌恰好铺满 \(3\times n\) 的平面的方案数;设 \(F(n,k)={f(n)\choose k},G(n,k)={g(n)\choose k}\),求:
ans1={1\over r-l+1}\sum_{i=l}^rF(i,k)\\
ans2={1\over r-l+1}\sum_{i=l}^rG(i,k)
\end{aligned}
\]
题解
\(f\) 和 \(g\) 的公式
首先我们需要表示出 \(f\) 和 \(g\)。\(f\) 是好递推的,我们可以用竖着的一张牌把最后一列直接填满,也可以用两张横着的牌填满最后两列,所以就可以直接得出 \(f\) 的递推式:
\]
然后列出递推式的特征方程:
\]
解得:
x_1={1-\sqrt5\over2}\\
x_2={\sqrt5+1\over2}
\end{cases}
\]
设 \(f(n)=A\times x_1^n+B\times x_2^n\),将 \(f(0)=f(1)=1\) 代入可以求得 \(f\) 的通项公式:
\]
现在我们尝试推导一下 \(g\) 式子。首先能发现当 \(2\nmid n\) 时无解,所以我们改一下 \(g\) 的定义,设 \(g(n)\) 表示用多米诺骨牌恰好铺满 \(3\times 2n\) 的平面的方案数。如果我们选择最后不去横跨 \(3\times2\) 的方格那么有 \(g(n)\leftarrow 3\times g(n-1)\);而如果我们选择横跨第 \(i\) 到第 \(n-1\) 个 \(3\times2\) 的方格,可以发现后半部分只有两种情况如下图。
于是对第二种情况我们枚举分界点,可得到完整 \(g\) 的式子:
\]
但是呢这个式子实在是太不优美,因为存在 \(O(n)\) 项,于是考虑差分:
g(n)-g(n-1)&=3\times g(n-1)-3\times g(n-2)+2\times g(n-2)\\
g(n)&=4\times g(n-1)-g(n-2)
\end{aligned}
\]
求出 \(g\) 的递推式后我们可以依葫芦画瓢得到 \(g\) 的通向式:
\]
后续的推导
求出两个函数的通向式后我们需要解决下面的问题:
\]
因为这里 \(l\) 和 \(r\) 太大了,直接做肯定不行。观察到只有 \(k\) 是小的,所以想把上面的东西变成和 \(k\) 有关的和式。我们先把组合数拆开:
\]
现在不管和式外面的东西,考虑里面最令人难受的是有一个 k 次下降幂。这启发我们将下降幂转成顺眼的普通幂。斯特林数在此不做展开,如果想学习斯特林数有关的知识这里推荐我的博客。
好了回归正题,我们用下降幂转普通幂就得到:
\]
用二项式定理展开最后的普通幂:
\]
调一下和式顺序,最后得到:
\]
最后面的是等比数列求和,有:
\]
记得特判 \(x=1\) 的情况,时间复杂度 \(O(k^2\log r)\)。
对取模意义下根号的处理
在取模意义下并不是所有的数都有二次剩余,所以我们需要寻找新的解决方式。对于此题因为根号下只有一种数,所以我们可以进行一个类似复数的定义:我们将所有数写成 \(a+bi\) 的形式,其中 \(i^2=x\)。举一个例子,若根号下只有 5,也就是 \(f\) 的计算,我们令 \(i^2=5\),然后类比复数的运算计算答案即可。
代码
const int K = 505, p = 998244353;
int isq;
inline int Add(int x, int y){return x - p + y >= 0 ? x - p + y : x + y;}
inline int Sub(int x, int y){return x < y ? x - y + p : x - y;}
inline int Mul(int x, int y){return 1ll * x * y % p;}
inline int Mo(ll x){return (x % p + p) % p;}
struct cp{int a, b; cp(ll _a = 0, ll _b = 0){a = Mo(_a), b = Mo(_b);}};
inline cp operator + (cp x, cp y){return cp{Add(x.a, y.a), Add(x.b, y.b)};}
inline cp operator - (cp x, cp y){return cp{Sub(x.a, y.a), Sub(x.b, y.b)};}
inline cp operator * (cp x, cp y){return cp{Add(Mul(x.a, y.a), Mul(isq, Mul(x.b, y.b))), Add(Mul(x.a, y.b), Mul(x.b, y.a))};}
inline cp operator ^ (cp x, ll y){cp res = cp(1, 0); for(; y; y >>= 1, x = x * x)if(y & 1)res = res * x; return res;}
inline cp operator / (cp x, cp y){cp t = cp(y.a, - y.b); x = x * t; return x * ((y * t) ^ (p - 2));}
inline bool operator == (cp x, cp y){return x.a == y.a and x.b == y.b;}
inline cp F(cp x, ll l, ll r){return x == cp(1, 0) ? cp(r - l + 1, 0) : ((x ^ (r + 1)) - (x ^ l)) / (x - cp(1, 0));}
cp s1[K][K], C[K][K], fac[K], ifa[K];
cp A, B, x, y;
void prework(){
s1[0][0] = C[0][0] = C[1][0] = fac[0] = ifa[0] = cp(1, 0);
for(int i = 1; i < K; ++i)for(int j = 1; j <= i; ++j)s1[i][j] = s1[i - 1][j - 1] + s1[i - 1][j] * cp(i - 1, 0);
for(int i = 1; i < K; C[++i][0] = cp(1, 0))for(int j = 1; j <= i; ++j)C[i][j] = C[i - 1][j] + C[i - 1][j - 1];
for(int i = 1; i < K; ++i)fac[i] = fac[i - 1] * cp(i, 0);
ifa[K - 1] = fac[K - 1] ^ (p - 2);
for(int i = K - 2; i; --i)ifa[i] = ifa[i + 1] * cp(i + 1, 0);
}
void init(int typ){
isq = typ & 1 ? 3 : 5;
A = typ & 1 ? cp(3, 1) / cp(6, 0) : cp(1, 0) / cp(0, 1);
B = typ & 1 ? cp(3, - 1) / cp(6, 0) : cp(- 1, 0) / cp(0, 1);
x = typ & 1 ? cp(2, 1) : cp(1, 1) / cp(2, 0);
y = typ & 1 ? cp(2, - 1) : cp(1, - 1) / cp(2, 0);
}
signed main(){
prework(); int T = rd(), typ = rd(); init(typ);
while(T--){
ll l = rd(), r = rd(), len = r - l + 1; int k = rd(); cp res;
if(typ & 1)l = (l + 1) / 2, r /= 2; else ++l, ++r;
for(int i = 0; i <= k; ++i){
cp tmp;
for(int j = 0; j <= i; ++j){
cp t = C[i][j] * (A ^ j) * (B ^ (i - j)) * F((x ^ j) * (y ^ (i - j)), l, r);
tmp = tmp + t;
}
tmp = tmp * s1[k][i];
res = (k - i & 1 ? res - tmp : res + tmp);
}
cout << (res / cp(len, 0) * ifa[k]).a << endl;
}
return 0;
}
luogu-P5320题解的更多相关文章
- Luogu P1993 题解
p1993 小康的农场 CSP_S 1=之后就没怎么写题解.. 推荐博客食用 预备知识 明显这是一道差分约束的题,以下简称差分 有些人可能不了解差分,请点 [传送门] 至于用差分做的题的特征,无一都是 ...
- luogu P5320 [BJOI2019]勘破神机
传送门 首先我们要知道要求什么.显然每次放方块要放一大段不能从中间分开的部分.设\(m=2\)方案为\(f\),\(m=3\)方案为\(g\),\(m=2\)可以放一个竖的,或者两个横的,所以\(f_ ...
- luogu 3426题解 (KMP)
题面 Byteasar 想在墙上涂一段很长的字符,他为了做这件事从字符的前面一段中截取了一段作为模版. 然后将模版重复喷涂到相应的位置后就得到了他想要的字符序列.一个字符可以被喷涂很多次,但是一个位置 ...
- Luogu P4643 【模板】动态dp
题目链接 Luogu P4643 题解 猫锟在WC2018讲的黑科技--动态DP,就是一个画风正常的DP问题再加上一个动态修改操作,就像这道题一样.(这道题也是PPT中的例题) 动态DP的一个套路是把 ...
- [题解向] CF#Global Round 1の题解(A $\to$ G)
这里是总链接\(Link\). \(A\) 题意:求\(\sum_{i=1}^{k} a_i\times b^{k-i}\)的奇偶性, \(k = \Theta(n \log n)\) --其实很容易 ...
- [luogu]P1053 篝火晚会[数学][群论]
[luogu]P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同 ...
- luoguP1379 八数码难题[启发式搜索]
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...
- 「HNOI 2019」白兔之舞
一道清真的数论题 LOJ #3058 Luogu P5293 题解 考虑$ n=1$的时候怎么做 设$ s$为转移的方案数 设答案多项式为$\sum\limits_{i=0}^L (sx)^i\bin ...
- [HNOI2003]消防局的设立 树形dp // 贪心
https://www.luogu.org/problemnew/show/P2279 一开始就想到了贪心的方法,不过一直觉得不能证明. 贪心的考虑是在深度从深到浅遍历每个结点的过程中,对于每个没有覆 ...
- [NOIP2018]保卫王国
嘟嘟嘟 由于一些知道的人所知道的,不知道的人所不知道的原因,我来发NOIP2018day2T3的题解了. (好像我只是个搬运工--) 这题真可以叫做NOIplus了,跟其他几道比较水的题果然不一样,无 ...
随机推荐
- 【转】Mysql索引失效的情况
在工作中经常能遇到索引失效的情况,只要索引失效就导致了SQL查询慢,服务响应慢,用户体验差的情况:所以下面我们就讨论一下MySQL中索引失效的情况 口诀 全职匹配我最爱,最左前缀要遵守: 带头大哥不能 ...
- 深入图解AQS实现原理和源码分析
AQS底层实现原理用一句话总结就是:volatile + CAS + 一个虚拟的FIFO双向队列(CLH队列).所以在了解AQS底层实现时,需要先深入了解一下CAS实现原理. #名词解释(1)CAS: ...
- w3cschool-网站建设
W3C 简介 什么是 W3C? W3C 指万维网联盟(World Wide Web Consortium) W3C 创建于1994年10月 W3C 由 Tim Berners-Lee 创建 W3C 是 ...
- Python代码将大量遥感数据的值缩放指定倍数的方法
本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像文件的方法. 首先,看一下本文的具体需求.我们现有一 ...
- Nmap 图形界面使用
Nmap 图形界面的使用 Zenmap,作为Nmap的图形用户界面(GUI),为用户提供了一个直观.易用的方式来执行网络扫描和分析.以下是一个关于如何使用Zenmap的详细指南. 扫描主机 使用Zen ...
- Python介绍以及应用场景
Python介绍以及应用场景 Python简介 Python,作为一种解释型.面向对象的高级编程语言,自1989年圣诞节期间由荷兰计算机科学家Guido van Rossum创造以来,已经取得了举 ...
- Windows的MySQL数据库升级(解压包方式)
1.背景描述 原来的 MySQL 在安装时,是最新的稳定版本 5.7.33 . 经过一段时间后,在原来的 MySQL 版本中,发现存在漏洞. 因为 MySQL 的官方补丁,需要 Oracle 的 si ...
- java连接mysql遇到sql执行错误,异常判断和抛出源码分析
一.代码处理过程
- Luogu P1784 数独 [ 模板 ] / P1074 靶形数独 题解 [ 蓝 ] [ 深搜 ] [ 剪枝 ] [ 卡常 ]
数独模板 , 靶形数独 卡了 2h ,再也不想写数独了. 普通数独 思路 显然是对每个格子进行枚举,类似八皇后的方法去做,朴素方法是由 \((1,1)\) 到 \((9,9)\) 遍历过去. 优化 我 ...
- 为什么TCP需要三次握手?深入解析背后的设计哲学
在互联网通信中,TCP(传输控制协议)是确保数据可靠传输的基石.而TCP连接的建立过程--"三次握手"(Three-Way Handshake),看似简单的三个步骤,却蕴含了网络协 ...