【LOJ】#3090. 「BJOI2019」勘破神机
LOJ#3090. 「BJOI2019」勘破神机
为了这题我去学习了一下BM算法。。
很容易发现这2的地方是\(F_{1} = 1,F_{2} = 2\)的斐波那契数列
3的地方是\(G_{1} = 3,G_{2} = 11\)其中下标表示长度的\(\frac{1}{2}\),可以得到\(G_{3} = 4G_{2} - G_{1}\)
然后我们列一波特征根方程,可以得到
\(m = 2\)时
$$
\left{\begin{matrix}
x_{1} = \frac{1 + \sqrt{5}}{2}
\ x_{2} = \frac{1 - \sqrt{5}}{2}
\ c_{1} = \frac{5 + \sqrt{5}}{10}
\ c_{2} = \frac{5 - \sqrt{5}}{10}
\end{matrix}\right.
$$
\(m = 3\)时
$$
\left{\begin{matrix}
x_{1} = 2 + \sqrt{3}
\ x_{2} = 2 - \sqrt{3}
\ c_{1} = \frac{3 + \sqrt{3}}{6}
\ c_{2} = \frac{3 - \sqrt{3}}{10}
\end{matrix}\right.
$$
然后我们会可以把阶乘\(n(n - 1)(n - 2)...(n - k + 1)\)当成一个k次多项式
然后暴力算出每一项的系数,然后我们要算的就是
\(\sum_{i = l}^{r} f_{i}^{k}\)
然后把通项带进去
\(\sum_{i = l}^{r} (c_{1}x_{1}^{i} + c_{2}x_{2}^{i})^{k}\)
\(\sum_{i = l}^{r}\sum_{j = 0}^{k}\binom{k}{j}c_{1}^{j}x_{1}^{ij}c_{2}^{k - j}x_{2}^{i(k - j)}\)
\(\sum_{j = 0}^{k}\binom{k}{j}c_{1}^{j}c_{2}^{k - j}\sum_{i = l}^{r}(x_{1}^{j}x_{2}^{k - j})^{i}\)
后面是等比数列求和,算一下就好了
复杂度是\(k^{2}\log r\)的
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 2005
#define ba 47
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {res = 0;T f = 1;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 +c - '0';c = getchar();}res *= f;
}
template<class T>
void out(T x) {if(x < 0) {x = -x;putchar('-');}if(x >= 10) {out(x / 10);}putchar('0' + x % 10);
}
const int MOD = 998244353;
int inc(int a,int b) {return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {return 1LL * a * b % MOD;
}
void update(int &x,int y) {x = inc(x,y);
}
int fpow(int x,int c) {int res = 1,t = x;while(c) {if(c & 1) res = mul(res,t);t = mul(t,t);c >>= 1;}return res;
}
template<int T>
struct Complex {int r,i;Complex(int _r = 0,int _i = 0) {r = _r;i = _i;}friend Complex operator + (const Complex &a,const Complex &b) {return Complex(inc(a.r,b.r),inc(a.i,b.i));}friend Complex operator - (const Complex &a,const Complex &b) {return Complex(inc(a.r,MOD - b.r),inc(a.i,MOD - b.i));}friend Complex operator * (const Complex &a,const Complex &b) {return Complex(inc(mul(a.r,b.r),mul(T,mul(a.i,b.i))),inc(mul(a.r,b.i),mul(b.r,a.i)));}friend Complex fpow(Complex x,int64 c) {Complex res(1,0),t = x;while(c) {if(c & 1) res = res * t;t = t * t;c >>= 1;}return res;}friend Complex Query(Complex x,int64 n) {if(x.r == 1 && !x.i) return (n + 1)% MOD;Complex u = 1 - fpow(x,n + 1),d = 1 - x,t;t = d;t.i = MOD - t.i;int iv = fpow((t * d).r,MOD - 2);u = u * t * iv;return u;}
};
int m,k,f[1005],fac[1005],invfac[1005];
int64 l,r;
int C(int n,int m) {if(n < m) return 0;return mul(fac[n],mul(invfac[m],invfac[n - m]));
}
namespace mequal2 {Complex<5> x1,x2,c1,c2;void Main() {int inv2 = fpow(2,MOD - 2),inv10 = fpow(10,MOD - 2);x1 = Complex<5>(inv2,inv2);x2 = Complex<5>(inv2,MOD - inv2);c1 = Complex<5>(mul(5,inv10),inv10);c2 = Complex<5>(mul(5,inv10),MOD - inv10);int ans = mul(invfac[k],fpow((r - l + 1) % MOD,MOD - 2));Complex<5> res;for(int j = 1 ; j <= k ; ++j) {Complex<5> s;for(int h = 0 ; h <= j ; ++h) {Complex<5> t = C(j,h) * fpow(c1,h) * fpow(c2,j - h),q = fpow(x1,h) * fpow(x2,j - h),p;p = Query(q,r) - Query(q,l - 1);s = s + t * p;}res = res + s * f[j];}ans = mul(ans,res.r);out(ans);enter;}
}
namespace mequal3 {Complex<3> x1,x2,c1,c2;void Main() {int inv6 = fpow(6,MOD - 2);x1 = Complex<3>(2,1);x2 = Complex<3>(2,MOD - 1);c1 = Complex<3>(mul(3,inv6),inv6);c2 = Complex<3>(mul(3,inv6),MOD - inv6);int ans = mul(invfac[k],fpow((r - l + 1) % MOD,MOD - 2));r = r / 2;if(l & 1) l = (l + 1) / 2;else l = l / 2;Complex<3> res;if(l <= r) {for(int j = 1 ; j <= k ; ++j) {Complex<3> s;for(int h = 0 ; h <= j ; ++h) {Complex<3> t = C(j,h) * fpow(c1,h) * fpow(c2,j - h),q = fpow(x1,h) * fpow(x2,j - h),p;p = Query(q,r) - Query(q,l - 1);s = s + t * p;}res = res + s * f[j];}}ans = mul(ans,res.r);out(ans);enter;}
}
void Solve() {read(l);read(r);read(k);memset(f,0,sizeof(f));f[1] = 1;for(int i = 1 ; i < k ; ++i) {for(int j = i + 1 ; j >= 1 ; --j) {f[j] = inc(mul(MOD - i,f[j]),f[j - 1]);}}if(m == 2) mequal2::Main();else mequal3::Main();
}
int main() {
#ifdef ivorysifreopen("f1.in","r",stdin);
#endifint T;read(T);read(m);fac[0] = 1;for(int i = 1 ; i <= 1000 ; ++i) fac[i] = mul(fac[i - 1],i);invfac[1000] = fpow(fac[1000],MOD - 2);for(int i = 999 ; i >= 0 ; --i) invfac[i] = mul(invfac[i + 1],i + 1);for(int i = 1 ; i <= T ; ++i) {Solve();}
}
转载于:https://www.cnblogs.com/ivorysi/p/10984467.html
【LOJ】#3090. 「BJOI2019」勘破神机相关推荐
- LOJ 3090 「BJOI2019」勘破神机——斯特林数+递推式求通项+扩域
题目:https://loj.ac/problem/3090 题解:https://www.luogu.org/blog/rqy/solution-p5320 1.用斯特林数把下降幂化为普通的幂次求和 ...
- loj 3090 「BJOI2019」勘破神机 - 数学
题目传送门 传送门 题目大意 设$F_{n}$表示用$1\times 2$的骨牌填$2\times n$的网格的方案数,设$G_{n}$$表示用$1\times 2$的骨牌填$3\times n$的网 ...
- 「BJOI 2019」勘破神机
传送门 problem 经过了一个月的艰苦尝试,你的研究团队破译了 "2""2""2" 型奥术宝石和 "3"" ...
- 【BJOI2019】勘破神机【数论】
传送门(难得正经一回) 神题,思想值得学习. 首先明确题意: 两个子问题,一个2xN,一个3xN. 接下来对这个问题进行慢慢的推敲 解方案数 很明显,我们要先解决放置方案数的公式,才能做这个题. 对于 ...
- 【BJOI2019】勘破神机(下降幂转自然幂)(第一类斯特林数)(特征方程)
传送门 题解: 完全自己推出来的第一道数学神题. 首先我们知道宽度为222的部分方案数是斐波那契数列. 设fnf_nfn表示长度为nnn的时候方案数,题目要求的实际上是这个东西: ∑n=lr(fnk ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- [BJOI2019]勘破神机
[BJOI2019]勘破神机 推式子好题 m=2,斐波那契数列,$f_{n+1}$项 不妨$++l,++r$,直接求$f_n$ 求$\sum C(f_n,k)$,下降幂转化成阶乘幂,这样都是多项式了, ...
- [BJOI2019]勘破神机(斯特林数,数论)
[BJOI2019]勘破神机(斯特林数,数论) 题面 洛谷 题解 先考虑\(m=2\)的情况. 显然方案数就是\(f_i=f_{i-1}+f_{i-2}\),即斐波那契数,虽然这里求出来是斐波那契的第 ...
- 【luogu P5320】勘破神机(数学)(数列特征方程)(第一类斯特林数)
勘破神机 题目链接:luogu P5320 题目大意 给你 l,r,kl,r,kl,r,k(其中 l,rl,rl,r 很大,k≤501k\leq 501k≤501),求: 1r−l+1∑i=lrCfi ...
最新文章
- android反编译出错,反编译出错信息
- Python多进程之构建进程池
- 推荐几个来自北大、南开的大神的公众号!
- 工具使用教程(二)【Github上传文件大于100M的文件】
- Eclipse中servlet显示无法导入javax.servlet包问题的解决方案
- Java 构造器 通过私有构造器强化不可实例化的能力
- Easyui按钮图标
- 【OFDM】AWGN 信道下 BPSK 调制 (卷积码) 性能对比仿真实验 (Matlab 实现)
- Alarm Clock
- nginx 会话保持
- PCA与2DPCA及2D-2DPCA零基础理解(上)
- 润飞rf1800支持解密吗_RF-3148USB,北京润飞编程器
- Stm32F4以太网远程固件升级BootLoader踩过官方的坑
- (初学)JDBC实现增删改查 一(Statement接口)
- uniapp 下拉列表插件 lable问题
- [C]数字炸弹小游戏
- Java封装的四个关键字
- 微信小程序 canvas 分享图片 生成图片
- 研华安装Linux系统,在自带显卡GeForce RTX 2070的研华MIC-770工控机上安装Ubuntu18.
- 分布式系统一致性的发展历史 (二)