勘破神机

题目链接:luogu P5320

题目大意

给你 l,r,kl,r,kl,r,k(其中 l,rl,rl,r 很大,k≤501k\leq 501k≤501),求:
1r−l+1∑i=lrCfik\dfrac{1}{r-l+1}\sum\limits_{i=l}^rC_{f_i}^kr−l+11​i=l∑r​Cfi​k​
1r−l+1∑i=lrCgik\dfrac{1}{r-l+1}\sum\limits_{i=l}^rC_{g_i}^kr−l+11​i=l∑r​Cgi​k​
fnf_nfn​ 为一个 2∗n2*n2∗n 的网格往里面放 1∗21*21∗2 的块填满的方案,gng_ngn​ 则是一个 3∗n3*n3∗n 的网格。

思路

首先 222 的答案我们可以看出答案其实是贴合与斐波那契数列 FiF_iFi​。
具体看一看会发现是 fi=Fi+1f_i=F_{i+1}fi​=Fi+1​,所以记得 l,rl,rl,r 加一。
然后斐波那契嘛,fi=fi−1+fi−2f_i=f_{i-1}+f_{i-2}fi​=fi−1​+fi−2​,然后可以表示成那个带根号的通式嘛。

然后我们通过特征方程这个东西,我们知道如果有一个二阶递推式,我们可以把它表示成一个通项公式。
于是开始了下面的步骤:

2

fi=fi−1+fi−2f_i=f_{i-1}+f_{i-2}fi​=fi−1​+fi−2​
f[n]=55[(1+52)n−(1−52)n]f[n]=\dfrac{\sqrt{5}}{5}[(\dfrac{1+\sqrt{5}}{2})^n-(\dfrac{1-\sqrt{5}}{2})^n]f[n]=55​​[(21+5​​)n−(21−5​​)n]
A=55,α=1+52,B=−55,β=1−52A=\dfrac{\sqrt{5}}{5},\alpha=\dfrac{1+\sqrt{5}}{2},B=-\dfrac{\sqrt{5}}{5},\beta=\dfrac{1-\sqrt{5}}{2}A=55​​,α=21+5​​,B=−55​​,β=21−5​​

3

思考要如何推出 fff 的值,首先把 f0,f1f_0,f_1f0​,f1​ 求出,因为可以作为边界,而且也是特征方程需要的。

f0=1,f1=3f_0=1,f_1=3f0​=1,f1​=3
fif_ifi​ 长度为 2i2i2i 的答案(所以记得两个边界要改,但是注意 r−l+1r-l+1r−l+1 要用之前的值)

于是进行思考,发现可以新放进来一个 2∗32*32∗3 的,然后有 333 中方法。
然后发现只有这样不够,因为可能会出现这样的:

而且呢,中间的粉色可能不止两个:

然后粉色可以是在 1,21,21,2 行或者 2,32,32,3 行,所以我们可以列出这样的式子:

fi=3fi−1+2(fi−2+fi−3+...)f_{i}=3f_{i-1}+2(f_{i-2}+f_{i-3}+...)fi​=3fi−1​+2(fi−2​+fi−3​+...)
fi=3fi−1+2(∑j=0i−2fj)f_i=3f_{i-1}+2(\sum\limits_{j=0}^{i-2}f_j)fi​=3fi−1​+2(j=0∑i−2​fj​)
fi−1=3fi−2+2(∑j=0i−3fj)f_{i-1}=3f_{i-2}+2(\sum\limits_{j=0}^{i-3}f_j)fi−1​=3fi−2​+2(j=0∑i−3​fj​)
fi−fi−1=3fi−1−fi−2f_i-f_{i-1}=3f_{i-1}-f_{i-2}fi​−fi−1​=3fi−1​−fi−2​
fi=4fi−1−fi−2f_i=4f_{i-1}-f_{i-2}fi​=4fi−1​−fi−2​

搞出了二阶递推式,就直接开始求通项公式吧!

fi−4fi−1+fi−2=0f_i-4f_{i-1}+f_{i-2}=0fi​−4fi−1​+fi−2​=0
x2−4x+1=0x^2-4x+1=0x2−4x+1=0
x1=4+232,x2=4−232x_1=\dfrac{4+2\sqrt{3}}{2},x_2=\dfrac{4-2\sqrt{3}}{2}x1​=24+23​​,x2​=24−23​​
x1=2+3,x2=2−3x_1=2+\sqrt{3},x_2=2-\sqrt{3}x1​=2+3​,x2​=2−3​
带入 f0=1,f1=3f_0=1,f_1=3f0​=1,f1​=3
Ax1n+Bx2n=fnAx_1^n+Bx_2^n=f_nAx1n​+Bx2n​=fn​

A+B=1A+B=1A+B=1
A(2+3)+B(2−3)=3A(2+\sqrt{3})+B(2-\sqrt{3})=3A(2+3​)+B(2−3​)=3

A(2+3)+(1−A)(2−3)=3A(2+\sqrt3)+(1-A)(2-\sqrt3)=3A(2+3​)+(1−A)(2−3​)=3
A(2+3)+2−3−A(2−3)=3A(2+\sqrt3)+2-\sqrt{3}-A(2-\sqrt3)=3A(2+3​)+2−3​−A(2−3​)=3
23A=1+32\sqrt3A=1+\sqrt323​A=1+3​
A=1+323=3+36A=\dfrac{1+\sqrt3}{2\sqrt3}=\dfrac{\sqrt3+3}{6}A=23​1+3​​=63​+3​
A=3+36,B=3−36A=\dfrac{3+\sqrt3}{6},B=\dfrac{3-\sqrt3}{6}A=63+3​​,B=63−3​​
f[n]=3+36(4+232)n+3−36(4−232)nf[n]=\dfrac{3+\sqrt3}{6}(\dfrac{4+2\sqrt{3}}{2})^n+\dfrac{3-\sqrt3}{6}(\dfrac{4-2\sqrt{3}}{2})^nf[n]=63+3​​(24+23​​)n+63−3​​(24−23​​)n
A=3+36,α=4+232,B=3−36,β=4−232A=\dfrac{3+\sqrt3}{6},\alpha=\dfrac{4+2\sqrt{3}}{2},B=\dfrac{3-\sqrt3}{6},\beta=\dfrac{4-2\sqrt{3}}{2}A=63+3​​,α=24+23​​,B=63−3​​,β=24−23​​
A=3+36,α=2+3,B=3−36,β=2−3A=\dfrac{3+\sqrt3}{6},\alpha=2+\sqrt{3},B=\dfrac{3-\sqrt3}{6},\beta=2-\sqrt{3}A=63+3​​,α=2+3​,B=63−3​​,β=2−3​


于是我们似乎把 fif_ifi​ 表示成了一个很好的形式,考虑开搞。

fi=Aαi+Bβif_i=A\alpha^i+B\beta^ifi​=Aαi+Bβi
∑i=0n(fik)\sum\limits_{i=0}^n\binom{f_i}{k}i=0∑n​(kfi​​)
∑i=0nfi!k!(fi−k)!\sum\limits_{i=0}^n\dfrac{f_i!}{k!(f_i-k)!}i=0∑n​k!(fi​−k)!fi​!​
∑i=0nfik‾k!\sum\limits_{i=0}^n\dfrac{f_i^{\underline k}}{k!}i=0∑n​k!fik​​​
1k!∑i=0n∑j=1k(−1)k−js(k,j)fij\dfrac{1}{k!}\sum\limits_{i=0}^n\sum\limits_{j=1}^k(-1)^{k-j}s(k,j)f_i^jk!1​i=0∑n​j=1∑k​(−1)k−js(k,j)fij​(斯特林数与下降幂的转化)
(补充:xk‾=∑j=1ks(k,j)xjx^{\overline k}=\sum\limits_{j=1}^ks(k,j)x^jxk=j=1∑k​s(k,j)xj)
1k!∑i=1k(−1)k−is(k,i)∑j=0nfji\dfrac{1}{k!}\sum\limits_{i=1}^k(-1)^{k-i}s(k,i)\sum\limits_{j=0}^nf_j^ik!1​i=1∑k​(−1)k−is(k,i)j=0∑n​fji​

设 gn,j=∑i=0nfijg_{n,j}=\sum\limits_{i=0}^nf_i^jgn,j​=i=0∑n​fij​
fi=Aαi+Bβif_i=A\alpha^i+B\beta^ifi​=Aαi+Bβi
gn,j=∑i=0n(Aαi+Bβi)jg_{n,j}=\sum\limits_{i=0}^n(A\alpha^i+B\beta^i)^jgn,j​=i=0∑n​(Aαi+Bβi)j
gn,j=∑k=0j(jk)∑i=0n(Aαi)k(Bβi)j−kg_{n,j}=\sum\limits_{k=0}^j\binom{j}{k}\sum\limits_{i=0}^n(A\alpha^i)^k(B\beta^i)^{j-k}gn,j​=k=0∑j​(kj​)i=0∑n​(Aαi)k(Bβi)j−k
gn,j=∑k=0j(jk)AkBj−k∑i=0nαikβi(j−k)g_{n,j}=\sum\limits_{k=0}^j\binom{j}{k}A^kB^{j-k}\sum\limits_{i=0}^n\alpha^{ik}\beta^{i(j-k)}gn,j​=k=0∑j​(kj​)AkBj−ki=0∑n​αikβi(j−k)
gn,j=∑k=0j(jk)AkBj−k1−α(n+1)kβ(n+1)(j−k)1−αkβj−kg_{n,j}=\sum\limits_{k=0}^j\binom{j}{k}A^kB^{j-k}\dfrac{1-\alpha^{(n+1)k}\beta^{(n+1)(j-k)}}{1-\alpha^k\beta^{j-k}}gn,j​=k=0∑j​(kj​)AkBj−k1−αkβj−k1−α(n+1)kβ(n+1)(j−k)​(等比数列求和)

1k!∑i=1k(−1)k−is(k,i)∑j=0nfji\dfrac{1}{k!}\sum\limits_{i=1}^k(-1)^{k-i}s(k,i)\sum\limits_{j=0}^nf_j^ik!1​i=1∑k​(−1)k−is(k,i)j=0∑n​fji​
1k!∑i=1k(−1)k−is(k,i)gn,i\dfrac{1}{k!}\sum\limits_{i=1}^k(-1)^{k-i}s(k,i)g_{n,i}k!1​i=1∑k​(−1)k−is(k,i)gn,i​
1k!∑i=1k(−1)k−is(k,i)(∑p=0i(ip)ApBi−p1−(αpβi−p)n+11−αpβi−p)\dfrac{1}{k!}\sum\limits_{i=1}^k(-1)^{k-i}s(k,i)(\sum\limits_{p=0}^i\binom{i}{p}A^pB^{i-p}\dfrac{1-(\alpha^{p}\beta^{i-p})^{n+1}}{1-\alpha^p\beta^{i-p}})k!1​i=1∑k​(−1)k−is(k,i)(p=0∑i​(pi​)ApBi−p1−αpβi−p1−(αpβi−p)n+1​)


小提示:
记得特判等比数列公比为 111。

代码

#include<cstdio>
#define ll long long
#define mo 998244353using namespace std;const int K = 550;
int gen;
int T, op, k;
ll C[K][K], S[K][K], l, r;ll ksm(ll x, ll y) {ll re = 1;while (y) {if (y & 1) re = re * x % mo;x = x * x % mo; y >>= 1;}return re;
}struct complex {ll x, y;complex(ll a = 0, ll b = 0) {x = a; y = b;}
}A, B, alpha, beta;//x+sqrt{y}
complex operator +(complex x, complex y) {return (complex){(x.x + y.x) % mo, (x.y + y.y) % mo};
}
complex operator -(complex x) {return (complex){(mo - x.x) % mo, (mo - x.y) % mo};}
complex operator -(complex x, complex y) {return x + (-y);}
complex operator *(complex x, complex y) {return (complex){(x.x * y.x + gen * x.y * y.y) % mo, (x.x * y.y + x.y * y.x) % mo};
}
complex inv(complex x) {ll fm = ksm((((x.x * x.x - gen * x.y * x.y) % mo + mo) % mo) % mo, mo - 2);return (complex){x.x * fm % mo, (mo - x.y) * fm % mo};
}complex ksm(complex x, ll y) {complex re = complex(1, 0);while (y) {if (y & 1) re = re * x;x = x * x; y >>= 1;}return re;
}void Init() {C[0][0] = 1;for (int i = 1; i < K; i++) {C[i][0] = 1; for (int j = 1; j < K; j++) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mo;}S[0][0] = 1;for (int i = 1; i < K; i++) {for (int j = 1; j < K; j++)S[i][j] = (S[i - 1][j - 1] + (i - 1) * S[i - 1][j] % mo) % mo;}gen = (op == 2) ? 5 : 3;if (op == 2) {A = (complex){0, ksm(5, mo - 2)}; alpha = (complex){ksm(2, mo - 2), ksm(2, mo - 2)};B = (complex){0, (mo - ksm(5, mo - 2)) % mo}; beta = (complex){ksm(2, mo - 2), (mo - ksm(2, mo - 2)) % mo};}if (op == 3) {A = (complex){ksm(2, mo - 2), ksm(6, mo - 2)}; alpha = (complex){2, 1};B = (complex){ksm(2, mo - 2), (mo - ksm(6, mo - 2)) % mo}; beta = (complex){2, mo - 1};}
}ll slove(ll n) {ll ans = 0, jc = 1; ll di = ((k & 1) ? 1 : mo - 1);for (int i = 1; i <= k; i++, di = mo - di) {complex sum; jc = jc * i % mo;for (int p = 0; p <= i; p++) {complex alphabeta = ksm(alpha, p) * ksm(beta, i - p);//你是一个一个一个特判啊啊啊!!!if (alphabeta.x == 1 && alphabeta.y == 0) {//特判公比为1的情况sum = sum + ((complex){C[i][p], 0} * ksm(A, p) * ksm(B, i - p) * (complex){(n + 1) % mo, 0});continue;}sum = sum + ((complex){C[i][p], 0} * ksm(A, p) * ksm(B, i - p) * ((complex){1, 0} - ksm(alphabeta, n + 1)) * inv((complex){1, 0} - alphabeta));}if (sum.y) {printf("f\n"); return -1;}(ans += di * S[k][i] % mo * sum.x % mo) %= mo;}return ans * ksm(jc, mo - 2) % mo;
}int main() {scanf("%d %d", &T, &op);Init();while (T--) {scanf("%lld %lld %d", &l, &r, &k); ll sz = (r - l + 1) % mo;if (op == 2) l++, r++;else l = (l + 1) / 2, r = r / 2;printf("%lld\n", (slove(r) - slove(l - 1) + mo) % mo * ksm(sz, mo - 2) % mo);}return 0;
}

【luogu P5320】勘破神机(数学)(数列特征方程)(第一类斯特林数)相关推荐

  1. loj 3090 「BJOI2019」勘破神机 - 数学

    题目传送门 传送门 题目大意 设$F_{n}$表示用$1\times 2$的骨牌填$2\times n$的网格的方案数,设$G_{n}$$表示用$1\times 2$的骨牌填$3\times n$的网 ...

  2. [BJOI2019]勘破神机

    [BJOI2019]勘破神机 推式子好题 m=2,斐波那契数列,$f_{n+1}$项 不妨$++l,++r$,直接求$f_n$ 求$\sum C(f_n,k)$,下降幂转化成阶乘幂,这样都是多项式了, ...

  3. 【LOJ】#3090. 「BJOI2019」勘破神机

    LOJ#3090. 「BJOI2019」勘破神机 为了这题我去学习了一下BM算法.. 很容易发现这2的地方是\(F_{1} = 1,F_{2} = 2\)的斐波那契数列 3的地方是\(G_{1} = ...

  4. [BJOI2019]勘破神机(斯特林数,数论)

    [BJOI2019]勘破神机(斯特林数,数论) 题面 洛谷 题解 先考虑\(m=2\)的情况. 显然方案数就是\(f_i=f_{i-1}+f_{i-2}\),即斐波那契数,虽然这里求出来是斐波那契的第 ...

  5. [BJOI2019]勘破神机(斯特林数+二项式定理+数学)

    题意:f[i],g[i]分别表示用1*2的骨牌铺2*n和3*n网格的方案数,求ΣC(f(i),k)和ΣC(g(i),k),对998244353取模,其中l<=i<=r,1<=l< ...

  6. 「BJOI 2019」勘破神机

    传送门 problem 经过了一个月的艰苦尝试,你的研究团队破译了 "2""2""2" 型奥术宝石和 "3"" ...

  7. 【BJOI2019】勘破神机(下降幂转自然幂)(第一类斯特林数)(特征方程)

    传送门 题解: 完全自己推出来的第一道数学神题. 首先我们知道宽度为222的部分方案数是斐波那契数列. 设fnf_nfn​表示长度为nnn的时候方案数,题目要求的实际上是这个东西: ∑n=lr(fnk ...

  8. 【BJOI2019】勘破神机【数论】

    传送门(难得正经一回) 神题,思想值得学习. 首先明确题意: 两个子问题,一个2xN,一个3xN. 接下来对这个问题进行慢慢的推敲 解方案数 很明显,我们要先解决放置方案数的公式,才能做这个题. 对于 ...

  9. LOJ 3090 「BJOI2019」勘破神机——斯特林数+递推式求通项+扩域

    题目:https://loj.ac/problem/3090 题解:https://www.luogu.org/blog/rqy/solution-p5320 1.用斯特林数把下降幂化为普通的幂次求和 ...

最新文章

  1. shell 安装lamp
  2. HDU 4832 Chess 排列组合 DP
  3. Oracle Code登录北京 代码盛宴邀你high起来|免费报名
  4. linux内核分析与应用 -- 并发(上)
  5. paip.分成系统会员推广分销系统的设计
  6. phpwamp mysql_PHPWAMP配置修改与Web服务器和php以及mysql的具体配置修改
  7. Java集成socket.io
  8. 计算机管理员禁用teredo怎么解决,计算机管理员已在本地禁用teredo什么意思
  9. QT控件被其他控件遮盖
  10. CPSE安博会圆满落幕,闪马智能精彩时刻全回顾
  11. 【HTML 教程】iframe
  12. 【论文阅读】ERNIE系列
  13. JAVA多线程技术-IO密集型与CPU密集型
  14. 设计模式(四)~结构型模式(2)
  15. 键盘与ASCII码对应表
  16. linux命令记忆方法,Linux命令快速巧记法
  17. 各种抠图动态图片_10种ps抠图办法(动态图演示全过程)
  18. 6.mtk 带升压ic的insell屏点亮
  19. EHCI控制器(2)——工作模式
  20. Kögra分形字体,字王锋锐、锋艺系列可以加入分形元素

热门文章

  1. Pandas高级教程之:自定义选项
  2. 使用cloud studio建立免费的云主机
  3. 外贸老鸟帮新人点评、修改的5个开发信案例
  4. 什么是 DOM 和 BOM?
  5. 一个大二渣渣准程序员的感动
  6. 零售航母沃尔玛公布业绩:喜忧参半
  7. 第六届“强网杯”青少年专项赛 writewp by 楠辞姐姐后援团
  8. 阿里副总裁贾扬清回应:确认离职,或投身AI架构创业!
  9. Vue.use 写多个_老师说“你女儿跟多个男生早恋”,爸爸的回应改变了女儿的一生|早恋|马伊琍|晓敏|老师|告白...
  10. 【DP练习】月饼盒(提高版)(vijos1255)