勘破神机
题目大意
给你 l,r,k(其中 l,r 很大,k≤501),求:
1r−l+1r∑i=lCkfi
1r−l+1r∑i=lCkgi
fn 为一个 2∗n 的网格往里面放 1∗2 的块填满的方案,gn 则是一个 3∗n 的网格。
思路
首先 2 的答案我们可以看出答案其实是贴合与斐波那契数列 Fi。
具体看一看会发现是 fi=Fi+1,所以记得 l,r 加一。
然后斐波那契嘛,fi=fi−1+fi−2,然后可以表示成那个带根号的通式嘛。
然后我们通过特征方程这个东西,我们知道如果有一个二阶递推式,我们可以把它表示成一个通项公式。
于是开始了下面的步骤:
2
fi=fi−1+fi−2
f[n]=√55[(1+√52)n−(1−√52)n]
A=√55,α=1+√52,B=−√55,β=1−√52
3
思考要如何推出 f 的值,首先把 f0,f1 求出,因为可以作为边界,而且也是特征方程需要的。
f0=1,f1=3
fi 长度为 2i 的答案(所以记得两个边界要改,但是注意 r−l+1 要用之前的值)
于是进行思考,发现可以新放进来一个 2∗3 的,然后有 3 中方法。
然后发现只有这样不够,因为可能会出现这样的:

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

然后粉色可以是在 1,2 行或者 2,3 行,所以我们可以列出这样的式子:
fi=3fi−1+2(fi−2+fi−3+...)
fi=3fi−1+2(i−2∑j=0fj)
fi−1=3fi−2+2(i−3∑j=0fj)
fi−fi−1=3fi−1−fi−2
fi=4fi−1−fi−2
搞出了二阶递推式,就直接开始求通项公式吧!
fi−4fi−1+fi−2=0
x2−4x+1=0
x1=4+2√32,x2=4−2√32
x1=2+√3,x2=2−√3
带入 f0=1,f1=3
Axn1+Bxn2=fn
A+B=1
A(2+√3)+B(2−√3)=3
A(2+√3)+(1−A)(2−√3)=3
A(2+√3)+2−√3−A(2−√3)=3
2√3A=1+√3
A=1+√32√3=√3+36
A=3+√36,B=3−√36
f[n]=3+√36(4+2√32)n+3−√36(4−2√32)n
A=3+√36,α=4+2√32,B=3−√36,β=4−2√32
A=3+√36,α=2+√3,B=3−√36,β=2−√3
于是我们似乎把 fi 表示成了一个很好的形式,考虑开搞。
fi=Aαi+Bβi
n∑i=0(fik)
n∑i=0fi!k!(fi−k)!
n∑i=0fk––ik!
1k!n∑i=0k∑j=1(−1)k−js(k,j)fji(斯特林数与下降幂的转化)
(补充:x¯¯¯k=k∑j=1s(k,j)xj)
1k!k∑i=1(−1)k−is(k,i)n∑j=0fij
设 gn,j=n∑i=0fji
fi=Aαi+Bβi
gn,j=n∑i=0(Aαi+Bβi)j
gn,j=j∑k=0(jk)n∑i=0(Aαi)k(Bβi)j−k
gn,j=j∑k=0(jk)AkBj−kn∑i=0αikβi(j−k)
gn,j=j∑k=0(jk)AkBj−k1−α(n+1)kβ(n+1)(j−k)1−αkβj−k(等比数列求和)
1k!k∑i=1(−1)k−is(k,i)n∑j=0fij
1k!k∑i=1(−1)k−is(k,i)gn,i
1k!k∑i=1(−1)k−is(k,i)(i∑p=0(ip)ApBi−p1−(αpβi−p)n+11−αpβi−p)
小提示:
记得特判等比数列公比为 1。
代码
#include<cstdio>
#define ll long long
#define mo 998244353
using 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;
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) {
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;
}
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现