CF717A Festival Organization 题解

news/2025/1/15 15:27:52/文章来源:https://www.cnblogs.com/Scarab/p/18406589

Description

一个合法的串定义为:长度在 \([l,r]\) 之间,且只含 0,1,并且不存在连续 \(2\) 个或更多的 \(0\)

现在要选出 \(k\) 个长度相同的合法的串,问有几种选法,答案模 \(10^9+7\)

Solution

容易发现答案为 \(\sum_{i=l+2}^{r+2}{\binom{Fib_i}{k}}\)。先将 \(l,r\) 都加 \(2\),题目就转化为了求 \(\sum_{i=l}^{r}{Fib_i^{\underline{k}}}\)

注意到下降幂是不好做区间求和的,考虑用第一类斯特林数转化为普通幂:

\[x^{\underline{k}}=\sum_{i=0}^{k}{(-1)^{k-i}{k\brack i}x^i} \]

于是题目相当于是求斐波那契数列的 \(k\) 次区间和。

但是斐波那契数列的 \(k\) 次区间和仍然是无法做的,注意到等比数列是可以求区间和的,所以可以用通项公式将斐波那契数转化成幂次:

\[\begin{aligned} Fib_i^k&=\left[\left(\frac{1+\sqrt 5}{2}\right)^i-\left(\frac{1-\sqrt 5}{2}\right)^i\right]^k\\ &=\sum_{j=0}^{i}{\binom{i}{j}\left(\frac{1+\sqrt 5}{2}\right)^{ij}\left(\frac{1-\sqrt 5}{2}\right)^{i(k-j)}}\\ &=\sum_{j=0}^{i}{\binom{i}{j}\left[\left(\frac{1+\sqrt 5}{2}\right)^{j}\left(\frac{1-\sqrt 5}{2}\right)^{k-j}\right]^i} \end{aligned} \]

这样就可以做了。但是有个问题,就是 \(\sqrt 5\)\(\bmod 10^9+7\) 意义下没有定义,所以需要维护一个形如 \(a+b\sqrt 5\) 的类。

注意等比数列的比为 \(1\) 的情况要特判。

时间复杂度:\(O(k^2\log r)\)

Code

#include <bits/stdc++.h>#define int int64_tconst int kMaxK = 205, kMod = 1e9 + 7, kInv2 = 500000004, kInv5 = 400000003;int k, l, r;
int C[kMaxK][kMaxK], S[kMaxK][kMaxK], fac[kMaxK], ifac[kMaxK];constexpr int qpow(int bs, int64_t idx = kMod - 2) {int ret = 1;for (; idx; idx >>= 1, bs = (int64_t)bs * bs % kMod)if (idx & 1)ret = (int64_t)ret * bs % kMod;return ret;
}inline int add(int x, int y) { return (x + y >= kMod ? x + y - kMod : x + y); }
inline int sub(int x, int y) { return (x >= y ? x - y : x - y + kMod); }
inline void inc(int &x, int y) { (x += y) >= kMod ? x -= kMod : x; }
inline void dec(int &x, int y) { (x -= y) < 0 ? x += kMod : x; }int getop(int x) { return (~x & 1) ? 1 : (kMod - 1); }struct Node {int a, b; // a + b * sqrt(5)Node(int _a = 0, int _b = 0) : a(_a), b(_b) {}Node inv() {int k = qpow(sub(1ll * a * a % kMod, 5ll * b % kMod * b % kMod));return {1ll * a * k % kMod, 1ll * sub(0, b) * k % kMod};}friend bool operator ==(Node a, Node b) { return a.a == b.a && a.b == b.b; }friend Node operator +(Node a, Node b) { return {add(a.a, b.a), add(a.b, b.b)}; }friend Node operator -(Node a, Node b) { return {sub(a.a, b.a), sub(a.b, b.b)}; }friend Node operator *(Node a, Node b) { return {add(1ll * a.a * b.a % kMod, 5ll * a.b % kMod * b.b % kMod), add(1ll * a.a * b.b % kMod, 1ll * a.b * b.a % kMod)}; }friend Node operator /(Node a, Node b) { return a * b.inv(); }friend Node operator -(Node a) { return {sub(0, a.a), sub(0, a.b)}; }
};Node qpow(Node bs, int idx) {Node ret = {1, 0};for (; idx; idx >>= 1, bs = bs * bs)if (idx & 1)ret = ret * bs;return ret;
}int getsum(int n, int k) {if (!n) return 0;Node ret = {0, 0}, a = {kInv2, kInv2}, b = {kInv2, sub(0, kInv2)};for (int i = 0; i <= k; ++i) {Node bs = qpow(a, i) * qpow(b, k - i), sum = {0, 0};if (bs == (Node){1, 0}) sum = {n % kMod, 0};else sum = (qpow(bs, n + 1) - bs) / (bs - (Node){1, 0});if (~(k - i) & 1) ret = ret + sum * (Node){C[k][i], 0};else ret = ret - sum * (Node){C[k][i], 0};}if (~k & 1) return 1ll * ret.a * qpow(kInv5, k / 2) % kMod;else return 1ll * ret.b * qpow(kInv5, k / 2) % kMod;
}int getsum(int l, int r, int k) {return sub(getsum(r, k), getsum(l - 1, k));
}void prework() {fac[0] = ifac[0] = C[0][0] = S[0][0] = 1, 1;for (int i = 1; i <= 200; ++i) {C[i][0] = 1;fac[i] = 1ll * i * fac[i - 1] % kMod;ifac[i] = qpow(fac[i]);for (int j = 1; j <= i; ++j) {C[i][j] = add(C[i - 1][j - 1], C[i - 1][j]);S[i][j] = add(S[i - 1][j - 1], 1ll * (i - 1) * S[i - 1][j] % kMod);}}
}void dickdreamer() {prework();std::cin >> k >> l >> r;l += 2, r += 2;int ans = 0;for (int i = 0; i <= k; ++i) {inc(ans, 1ll * S[k][i] * getop(k - i) % kMod * getsum(l, r, i) % kMod);}std::cout << 1ll * ans * ifac[k] % kMod << '\n';
}int32_t main() {
#ifdef ORZXKRfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifstd::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T = 1;// std::cin >> T;while (T--) dickdreamer();// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/794998.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0.1+0.2 != 0.3 (Java为例)

1. 小数的二进制表示 以10.625为例。整数部分进行除2取余的操作,10的二进制为1010。小数部分进行乘2取整操作,直到小数部分为0或达到需要的精度:0.625*2=1.25 取整数1,小数部分0.25继续计算 0.25*2=0.5 取整数0,小数部分0.5继续计算 0.5*2=1.0 取整数1,小数部分为0,停止…

信创领域认证,来自工信部人才交流中心的PostgreSQL培训班

在国家大力发展信创软件和数据库行业的背景下,PostgreSQL 具有多方面的优势和机遇,具体体现在以下几个方面: 1. 技术优势契合信创需求: PostgreSQL 数据库是一个功能强大、性能稳定、可扩展性强的开源对象关系数据库系统,支持多种数据类型(如数组、JSON、XML 等),方便存储…

Salesforce职业规划:原厂,甲方,乙方,从业者应该如何选择?

Salesforce生态系统蓬勃发展,对不同角色的需求量不断增加。需求方包括使用Salesforce的最终用户(甲方)、实施Salesforce的咨询公司、为Salesforce创建应用程序的AppExchange公司(或ISV),当然还有Salesforce原厂。 Salesforce最终用户(甲方) 2020年,Salesforce的客户数…

3SRB5016-ASEMI三相整流桥3SRB5016

3SRB5016-ASEMI三相整流桥3SRB5016编辑:ll 3SRB5016-ASEMI三相整流桥3SRB5016 型号:3SRB5016 品牌:ASEMI 封装:3SRB-5 批号:2024+ 现货:50000+ 最大重复峰值反向电压:1600V 最大正向平均整流电流(Vdss):50A 功率(Pd):大功率 芯片个数:5 引脚数量:5 安装方式:直插 类…

34-样式迁移

类似于加了一层滤镜基于CNN的样式迁移:如下对于合成图片X,我们希望它的内容和输入的内容图片,放入同一个CNN,在某一个卷积层上,输出的与内容有关的特征能够匹配 同时,,对于样式图片,我们希望合成图片X,和样式图片放入同一个CNN,在某一个卷积层上,输出的与样式有关的…

STM32-ADC外设

1.通道 .规则通道 .注入通道 2.规则序列寄存器 配置通道的采样顺序 3.ADC周期4.ADC转换方式 *单次转换:adc每次只采集某个通道的一个点,如果需要再次采集,就需要重新使能。 *连续转换:adc采集某个通道一个点,转换完成后,再采集第二点。依次类推 4.扫描模式 *单次扫描模式…

SignalR跨域问题解决

本文来自博客园,作者:WantRemake,转载请注明原文链接:https://www.cnblogs.com/SmallChen/p/18406437

字符串类

常用类String基础知识String类的特性String类是一个final类,不能被继承 String类底层是一个final修饰的字符数组,表示不可变的字符序列(final char value[ ]) String的不可变性:当String值改变时,会在常量池中创建新的字符串字符串-创建字面量方式创建 String s1="a…

AI答案之书解来为你解决难题

本文由 ChatMoney团队出品介绍说明 “答案之书智能体”是您贴心的智慧伙伴,随时准备为您解答生活中的种种困惑。无论您在工作中遭遇瓶颈,还是在情感世界里迷失方向,亦或是对个人成长感到迷茫,它都能倾听您的心声,并给予准确且富有启发的回应。 它并非简单地给出答案,而是…

解锁生活密码,AI答案之书解决复杂难题

本文由 ChatMoney团队出品介绍说明 “答案之书智能体”是您贴心的智慧伙伴,随时准备为您解答生活中的种种困惑。无论您在工作中遭遇瓶颈,还是在情感世界里迷失方向,亦或是对个人成长感到迷茫,它都能倾听您的心声,并给予准确且富有启发的回应。 它并非简单地给出答案,而是…

STM32F7外设FMC控制LCD显示屏

STM32F7外设FMC控制LCD显示屏, 显示屏的点阵LCD控制器(Dot Matrix LCD Controller/Driver)是ST7066U。 配置 在CubeMX中选择图 1 根据实际情况选择,Bank几,LCD片选引脚。图 2 FMC原理 对于FMC如何控制LCD,我的理解: FMC能自动发送数据读写RAM,通过FMC读写LCD的显存就可以…