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」勘破神机相关推荐

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

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

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

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

  3. 「BJOI 2019」勘破神机

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

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

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

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

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

  6. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  7. [BJOI2019]勘破神机

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

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

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

  9. 【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 ...

最新文章

  1. android反编译出错,反编译出错信息
  2. Python多进程之构建进程池
  3. 推荐几个来自北大、南开的大神的公众号!
  4. 工具使用教程(二)【Github上传文件大于100M的文件】
  5. Eclipse中servlet显示无法导入javax.servlet包问题的解决方案
  6. Java 构造器 通过私有构造器强化不可实例化的能力
  7. Easyui按钮图标
  8. 【OFDM】AWGN 信道下 BPSK 调制 (卷积码) 性能对比仿真实验 (Matlab 实现)
  9. Alarm Clock
  10. nginx 会话保持
  11. PCA与2DPCA及2D-2DPCA零基础理解(上)
  12. 润飞rf1800支持解密吗_RF-3148USB,北京润飞编程器
  13. Stm32F4以太网远程固件升级BootLoader踩过官方的坑
  14. (初学)JDBC实现增删改查 一(Statement接口)
  15. uniapp 下拉列表插件 lable问题
  16. [C]数字炸弹小游戏
  17. Java封装的四个关键字
  18. 微信小程序 canvas 分享图片 生成图片
  19. 研华安装Linux系统,在自带显卡GeForce RTX 2070的研华MIC-770工控机上安装Ubuntu18.
  20. 分布式系统一致性的发展历史 (二)

热门文章

  1. Chrome浏览器截取网页生成图片
  2. Box2D 的 PTM_RATIO
  3. 【转载】ubuntu下linux内核源码阅读工具和调试方法总结
  4. 《深度学习之PyTorch物体检测实战》—读书笔记
  5. 【QCM2150】WCN3680 WFA认证关于不同带宽配置
  6. 7-2 动物爱吃什么?
  7. 史上最全电子元器件实物外形图+电路符号
  8. 特写:美国B2C网站惨淡经营
  9. Spring Boot 3.x 系列【23】集成Spring WebFlux开发响应式应用程序
  10. 生产系统规划仿真软件