简要题意

设 \(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. c# UWP 墨迹 手写识别

    <InkCanvas Name="inkCanvas"></InkCanvas> <Button Name="btnRecognize&qu ...

  2. 微服务实战系列(三)-springcloud、springboot及maven之间关系-copy

    1 . 问题描述 随着springboot.springcloud的不断迭代升级,开发效率不断提升,越来越多的开发团队加入到spring的大军中,今天用通俗的语言,介绍下什么是springboot,s ...

  3. Android基础入门教程-参考资料

    2)看视频 网上关于Android的视频教程有很多,这里分享下基神力荐的黑马教程吧: 黑马28期Android全套视频无加密完整版:密码:h7jz 52期不加密版:密码:zve8 当然下面这些视频学习 ...

  4. w3cschool-Netty 实战精髓篇2

    https://www.w3cschool.cn/essential_netty_in_action/essential_netty_in_action-adkv28bm.html 研究Netty中的 ...

  5. weixueyuan-Nginx日志管理与监控8

    https://www.weixueyuan.net/nginx/log/ Nginx访问日志配置 Nginx 的访问日志主要记录用户客户端的请求信息(见下表).用户的每次请求都会记录在访问日志中,a ...

  6. Hive2升hive3报错

    一.网上总结的报错 1.coalesce报错 FAILED: SemanticException [Error 10014]: Line 197:4 Wrong arguments ''10'': U ...

  7. IDEA引入大项目一直updating indices解决办法

    一.如项目不需要某个目录建立索引 右键需要排除的项目

  8. Luogu P4425 转盘 题解 [ 黑 ] [ 线段树 ] [ 贪心 ] [ 递归 ]

    转盘:蒟蒻的第一道黑,这题是贪心和线段树递归合并的综合题. 贪心 破环成链的 trick 自然不用多说. 首先观察题目,很容易发现一个性质:只走一圈的方案一定最优.这个很容易证,因为再绕一圈回来标记前 ...

  9. 从 14 秒到 1 秒:MySQL DDL 性能优化实战

    1. 问题背景 MySQL版本:8.0.30 测试表数据量:200万 在 MySQL 中,研发人员最初执行了以下 SQL 语句,向表 t_email 中添加了一个允许为 NULL 的列 id3,并设置 ...

  10. DeepSeek本地性能调优

    技术背景 大模型性能调优是一个很复杂的工程,涉及到很多细节,如果真要对模型动刀子,还需要对模型和数据集本身有非常好的理解.这里我们仅仅考虑模型加载过程中,可以优化的一些参数配置.关于DeepSeek在 ...