简要题意

设 \(f(n)\) 表示用多米诺骨牌恰好铺满 \(2\times n\) 的平面的方案数,\(g(n)\) 表示用多米诺骨牌恰好铺满 \(3\times n\) 的平面的方案数;设 \(F(n,k)={f(n)\choose k},G(n,k)={g(n)\choose k}\),求:

\[\begin{aligned}
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\) 的递推式:

\[f(n)=f(n-1)+f(n-2),f(0)=1,f(1)=1
\]

然后列出递推式的特征方程:

\[x^2-x-1=0
\]

解得:

\[\begin{cases}
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\) 的通项公式:

\[f(n)={5+\sqrt5\over10}\left({1+\sqrt5\over2}\right)^n+{5-\sqrt5\over10}\left({1-\sqrt5\over2}\right)^n
\]

现在我们尝试推导一下 \(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\) 的式子:

\[g(n)=3\times g(n-1)+2\sum_{i=0}^{n-2}g(i)
\]

但是呢这个式子实在是太不优美,因为存在 \(O(n)\) 项,于是考虑差分:

\[\begin{aligned}
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\) 的通向式:

\[g(n)={3+\sqrt3\over6}\left(2+\sqrt3\right)^n+{3-\sqrt3\over6}\left(2-\sqrt3\right)^n
\]

后续的推导

求出两个函数的通向式后我们需要解决下面的问题:

\[{1\over r-l+1}\sum_{n=l}^r{Ax_1^n+Bx_2^n\choose k}
\]

因为这里 \(l\) 和 \(r\) 太大了,直接做肯定不行。观察到只有 \(k\) 是小的,所以想把上面的东西变成和 \(k\) 有关的和式。我们先把组合数拆开:

\[ans={1\over(r-l+1)k!}\sum_{n=l}^r\left(Ax_1^n+Bx_2^n\right)^{\underline k}
\]

现在不管和式外面的东西,考虑里面最令人难受的是有一个 k 次下降幂。这启发我们将下降幂转成顺眼的普通幂。斯特林数在此不做展开,如果想学习斯特林数有关的知识这里推荐我的博客

好了回归正题,我们用下降幂转普通幂就得到:

\[\sum_{n=l}^r\sum_{i=0}^k(-1)^{k-i}{k\brack i}\left(Ax_1^n+Bx_2^n\right)^i
\]

用二项式定理展开最后的普通幂:

\[\sum_{n=l}^r\sum_{i=0}^k(-1)^{k-i}{k\brack i}\sum_{j=0}^i{i\choose j}A^iB^{i-j}\left(x_1^ix_2^{i-j}\right)^n
\]

调一下和式顺序,最后得到:

\[\sum_{i=0}^k(-1)^{k-i}{k\brack i}\sum_{j=0}^i{i\choose j}A^iB^{i-j}\sum_{n=l}^r\left(x_1^ix_2^{i-j}\right)^n
\]

最后面的是等比数列求和,有:

\[\sum_{i=l}^rx^i={x^{r+1}-x^l\over x-1}
\]

记得特判 \(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题解的更多相关文章

  1. Luogu P1993 题解

    p1993 小康的农场 CSP_S 1=之后就没怎么写题解.. 推荐博客食用 预备知识 明显这是一道差分约束的题,以下简称差分 有些人可能不了解差分,请点 [传送门] 至于用差分做的题的特征,无一都是 ...

  2. luogu P5320 [BJOI2019]勘破神机

    传送门 首先我们要知道要求什么.显然每次放方块要放一大段不能从中间分开的部分.设\(m=2\)方案为\(f\),\(m=3\)方案为\(g\),\(m=2\)可以放一个竖的,或者两个横的,所以\(f_ ...

  3. luogu 3426题解 (KMP)

    题面 Byteasar 想在墙上涂一段很长的字符,他为了做这件事从字符的前面一段中截取了一段作为模版. 然后将模版重复喷涂到相应的位置后就得到了他想要的字符序列.一个字符可以被喷涂很多次,但是一个位置 ...

  4. Luogu P4643 【模板】动态dp

    题目链接 Luogu P4643 题解 猫锟在WC2018讲的黑科技--动态DP,就是一个画风正常的DP问题再加上一个动态修改操作,就像这道题一样.(这道题也是PPT中的例题) 动态DP的一个套路是把 ...

  5. [题解向] CF#Global Round 1の题解(A $\to$ G)

    这里是总链接\(Link\). \(A\) 题意:求\(\sum_{i=1}^{k} a_i\times b^{k-i}\)的奇偶性, \(k = \Theta(n \log n)\) --其实很容易 ...

  6. [luogu]P1053 篝火晚会[数学][群论]

    [luogu]P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同 ...

  7. luoguP1379 八数码难题[启发式搜索]

    题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...

  8. 「HNOI 2019」白兔之舞

    一道清真的数论题 LOJ #3058 Luogu P5293 题解 考虑$ n=1$的时候怎么做 设$ s$为转移的方案数 设答案多项式为$\sum\limits_{i=0}^L (sx)^i\bin ...

  9. [HNOI2003]消防局的设立 树形dp // 贪心

    https://www.luogu.org/problemnew/show/P2279 一开始就想到了贪心的方法,不过一直觉得不能证明. 贪心的考虑是在深度从深到浅遍历每个结点的过程中,对于每个没有覆 ...

  10. [NOIP2018]保卫王国

    嘟嘟嘟 由于一些知道的人所知道的,不知道的人所不知道的原因,我来发NOIP2018day2T3的题解了. (好像我只是个搬运工--) 这题真可以叫做NOIplus了,跟其他几道比较水的题果然不一样,无 ...

随机推荐

  1. 记录一下关于谷歌浏览器的开发者插件之vue-devtools

    在做vue进行开发的时候增加一个浏览器的插件进行开发可以做到游鱼得水,更加的舒适 在这里我留下一个git地址用来下载插件包 https://gitee.com/zhang_banglong/vue-d ...

  2. VS2022推送代码 到github错误: CertGetCertificateChain trust error CERT_TRUST_IS_PARTIAL_CHAIN的解决办法

    VS2022推送代码 到github错误: CertGetCertificateChain trust error CERT_TRUST_IS_PARTIAL_CHAIN 解决办法: 进入到 选项&g ...

  3. java基础知识回顾之java Thread类学习(二)--java多线程安全问题(锁)

    上一节售票系统中我们发现,打印出了错票,0,-1,出现了多线程安全问题.我们分析为什么会发生多线程安全问题? 看下面线程的主要代码: @Override public void run() { // ...

  4. Mac配置apache cgi服务

    CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口 Mac上是自带CGI运行程序的,但是直接是不可 ...

  5. RocketMQ原理—1.RocketMQ整体运行原理

    大纲 1.RocketMQ整体运行原理的介绍顺序 2.RocketMQ生产者是如何发送消息的 3.Broker是如何持久化接收到的消息到磁盘上 4.基于DLedger技术的Broker主从同步原理 5 ...

  6. delphi中实现http请求和提交

    在对接本地的一个药械监管系统使用实现的代码,编译环境delphi Xe7 ,使用类TIdHTTP实现网络的get请求和post提交 //设置组件的属性 procedure TfrmMain.SetHt ...

  7. 本地搭建DeepSeek和知识库 Dify做智能体Agent(推荐)

    一.基础信息 1.硬件环境: CPU >= 2 Core 显存/RAM ≥ 16 GiB(推荐) 2.软件 (1)Ollama Ollama 是一款跨平台的大模型管理客户端(MacOS.Wind ...

  8. mac安装php单点调试环境

    页面预览和抓包方式 sudo php-fpm sudo killall php-fpm 开启/usr/local/etc/nginx/ nginx nginx -s quit 运行Charles就行 ...

  9. Markdown语法基础教学

    Markdown语法基础教学 简介 Markdown是一种轻量级的标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML.它的目标是实现"易读易写",并且 ...

  10. python接入百度智能云API实现ai对话

    python接入百度智能云API实现ai对话 千帆大模型平台-百度智能云千帆 代码段: import requests import json # 获取访问令牌的函数 def get_access_t ...