敬启,致那时的我

news/2025/10/21 21:18:53/文章来源:https://www.cnblogs.com/kklxy/p/19156429

题面

题目描述

实乃理给你两个整数 \(S, k\),你需要帮她求出以下式子的值对 \(1,000,000,007\) 取模的结果:

\[\sum_{X = 0}^S [\mathrm{popc}(X) = k]F(X) \]

其中 \(F\) 为斐波那契数列,即 \(F(0) = F(1) = 1, F(n) = F(n - 1) + F(n - 2)\)\(\mathrm{popc}(X)\) 表示 \(X\) 的二进制表示中 \(1\) 的个数。

输入格式

第一行两个整数 \(n, k\)

第二行一个长度为 \(n\)\(01\)\(S_{2}\),代表 \(S\) 的二进制表示。保证 \(S_2\) 没有前导零。

输出格式

输出一行一个整数表示答案对 \(1,000,000,007\) 取模的结果。

输入输出样例 #1

输入 #1

3 0
110

输出 #1

1

输入输出样例 #2

输入 #2

3 1
110

输出 #2

8

输入输出样例 #3

输入 #3

3 2
110

输出 #3

24

输入输出样例 #4

输入 #4

17 8
11011111101010010

输出 #4

894224396

说明/提示

样例解释

对于样例一,答案为 \(F(0) = 1\)

对于样例二,答案为 \(F(1) + F(2) + F(4) = 1 + 2 + 5 = 8\)

对于样例三,答案为 \(F(3) + F(5) + F(6) = 3 + 8 + 13 = 24\)

数据范围

对于 \(100\%\) 的数据,\(0 \le k \le n \le 2 \times 10^3\)\(n, S \ge 1\)

子任务编号 特殊性质 分数
\(1\) A \(20\)
\(2\) B \(30\)
\(3\) C \(30\)
\(4\) \(20\)

特殊性质 A:\(S \le 10^6\)

特殊性质 B:\(k \le 2\)

特殊性质 C:\(S\) 可以表示为 \(2^y - 1\) 的形式,其中 \(y\) 是一个正整数。

题解

这道题发现是FIB序列,那这个FIB序列没啥好的性质,只能用矩阵乘法快速求出。

这道题开始通过特殊性质B,发现如果枚举两个一在哪里然后再去算矩阵快速幂这样是 \(O(n^3)\) 会超时,那我们发现快速幂这个东西本质不就是在每个二进制为一的时候去乘一下当前的阶乘吗?那我们就可以把快速幂数组预处理出来。那这样我们就不用每次去重新做一遍快速幂了。

那这个部分分启示我们要预处理快速幂数组,那我们考虑预处理完这个题目变成了什么别的形式,那现在这个题目变成了在这n个预处理出的快速幂元素中,选择k个相乘的和,那这个是好做的:设 \(f_{i,j}\) 表示前i个元素选了j个的乘积和。

那本题还要考虑是否超过了上界,那这个就写一个类似数位dp的东西,记录每一位是否已经达到上界即可。

最终状态设计:\(f_{i,j,0/1}\) 表示前i个元素选了j个是否到达上界的乘积和。

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 1e9 + 7;
struct MAT
{ll a[2][2];MAT operator*(const MAT &x) const{MAT c;c.a[0][0] = c.a[0][1] = c.a[1][0] = c.a[1][1] = 0;for (int k = 0; k < 2; k++){for (int i = 0; i < 2; i++){for (int j = 0; j < 2; j++){c.a[i][j] += a[i][k] * x.a[k][j] % mod;c.a[i][j] %= mod;}}}return c;}MAT operator+(const MAT &x) const{MAT c;c.a[0][0] = c.a[0][1] = c.a[1][0] = c.a[1][1] = 0;for (int i = 0; i < 2; i++){for (int j = 0; j < 2; j++){c.a[i][j] = (a[i][j] + x.a[i][j]) % mod;}}return c;}void print(){for (int i = 0; i < 2; i++){for (int j = 0; j < 2; j++){cout << a[i][j] << " \n"[j == 1];}}}
} base, bse, ksm[2005], f[2][2005][2], zro, fib;
int main()
{ios::sync_with_stdio(0), cin.tie(0);int n, K;cin >> n >> K;string s;cin >> s;// reverse(s.begin(), s.end());fib.a[0][0] = fib.a[0][1] = 1;fib.a[1][0] = fib.a[1][1] = 0;bse.a[0][0] = bse.a[1][1] = 1;bse.a[0][1] = bse.a[1][0] = 0;base.a[0][0] = base.a[0][1] = base.a[1][0] = 1;base.a[1][1] = 0;ksm[n - 1] = base;for (int i = n - 2; i >= 0; i--){base = base * base;ksm[i] = base;}int cur = 0, nxt = 1;f[cur][0][1] = bse;for (int i = 0; i < n; i++){for (int j = 0; j <= K; j++){for (int tt = 0; tt <= 1; tt++){f[nxt][j][tt] = zro;}}int bit = s[i] - '0';MAT MT = ksm[i];for (int j = 0; j <= K; j++){for (int tt = 0; tt <= 1; tt++){if (f[cur][j][tt].a[0][0] == 0 && f[cur][j][tt].a[0][1] == 0 && f[cur][j][tt].a[1][0] == 0 && f[cur][j][tt].a[1][1] == 0){continue;}int zd = 1;if (tt){zd = bit;}for (int tb = 0; tb <= zd; tb++){int ntt = (tt & (tb == zd));int nj = j + tb;if (nj > K){continue;}MAT nw = f[cur][j][tt];MAT nMT = nw * (tb ? MT : bse);f[nxt][nj][ntt] = f[nxt][nj][ntt] + nMT;}}}swap(cur, nxt);}cout << ((f[cur][K][0]).a[0][0] + (f[cur][K][1]).a[0][0]) % mod;return 0;
}

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

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

相关文章

阿里云对象存储OSS之Java - Soul

阿里云对象存储OSS 介绍阿里云对象存储OSS是一款非常强大的云存储服务——提供的海量、安全、低成本、高持久性的对象存储服务,通过RESTful API提供HTTP接口。 核心特性:无限扩展:存储空间和文件数量无上限。 多存储…

清楚标签默认样式,内容溢出盒子时的处理

所有标签都有默认样式 scroll:无论是否一处都显示水平和竖直的滚动条, auto:只有当水平或者竖直方向移出时才会显示

Solidity合约继承场景下的构造函数执行顺序

Solidity合约继承场景下的构造函数执行顺序“从远到近,从左到右” 举例,TetherToken有如下继承关系: TetherToken is Pausable, StandardToken, BlackList多重继承时,"从左到右",先初始化 Pausable,再…

后量子密码学技术与标准化进程解析

本文深入探讨后量子密码学技术发展现状,涵盖NIST标准化进程、密码算法创新及实际部署方案。重点分析SPHINCS+签名框架、混合密钥交换机制在TLS协议中的实现,以及云计算环境下的技术迁移路径。为后量子密码学未来做好…

用 大模型 和 Gradio 构建一个 AI 反向词典

卡在嘴边的词?用 MindSpore 和 Gradio 构建一个 AI 反向词典 你是否曾有过这样的经历:一个概念、一种情绪或一个场景在脑海中无比清晰,但就是想不起那个最贴切的词来形容它?这种“话在嘴边说不出”的窘境,是我们在…

1279. 红绿灯路口

1279. 红绿灯路口 题目描述这是两条路的交叉路口。第一条路是 A 路,车辆可沿 1 号方向由北向南行驶,也可沿 2 号方向由南向北行驶。第二条路是 B 路,车辆可沿 3 号方向由西向东行驶,也可沿 4 号方向由东向西行驶。…

反数字化:线下活动也能年赚百万

Jonathan Courtney在2025年靠线下高端小众活动赚了100万美元。以下是他实操过的11步清单👇1️⃣. 选定方向:反潮流,做"反AI反数字化",专注线下体验。1分钟就能决定,大胆出手,不卷线上。2️⃣. 明确细…

python概念详解

1.is和==有什么区别? 在 Python 中,is和都用于比较,但它们的比较对象和逻辑完全不同,核心区别在于:is比较的是 “对象身份”(是否为同一个对象),比较的是 “对象值”(是否相等)。is:比较的是两个对象的id值…

JAVA基础理解

1.封装 封装是面向对象的三大特征之一,意思为隐藏对象的属性和实现细节,Java中的封装就是根据访问控制修饰符实现的public(公共的):对外公开,所有类都可以访问 protected(受保护的): 只能在同一个包中的类或子…

用户消费行为数据分析(随笔)

需求分析(流程) 1、数据收集 项目的第一步是收集大量的用户消费数据。 2、数据清洗与预处理 收集到的数据可能存在错误、缺失或重复项,需要进行数据清洗和预处理,确保数据的准确性和完整性,使其适合后续的工作。 …

sqlserver 主要的日期函数及用法示例

SQL Server 主要日期函数及用法示例 1. 获取当前日期和时间sqlSELECT GETDATE() AS CurrentDateTime, -- 当前日期时间GETUTCDATE() AS CurrentUTCDateTime, -- 当前UTC时间SYSDATETIME() AS SystemDate…

ICPC2022沈阳 游记(VP)

中期艰难挂机,最后勉强四题仅有铜中。省流 中期艰难挂机,最后勉强四题仅有铜中。10.21 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 点外卖没给一次性筷子,飞奔到食堂获取圣遗物然后 \(4min22s\) 速通结块…

大数据分析基础及应用案例:第四周学习报告——线性回归模型

时间过得很快,大数据分析学习已经进入第四周。这一周,我们聚焦于线性回归模型—— 这个看似简单却贯穿数据分析领域的核心算法。从理论公式推导到实际案例落地,我不仅掌握了模型的基本逻辑,更体会到 “用数据解释规…

「LG7446-rfplca」题解

题解记录P7446 [Ynoi2007] rfplca sol 考虑如何找 LCA,通常来说我们会使用倍增,然而这道题带修,因此倍增不可实现。 考虑对序列分块,每个点维护其父亲以及其最近的不与其在同一块中的祖先,散块重构是简单的,但貌…

图论刷题记录

P8186 [USACO22FEB] Redistributing Gifts SFloyd 传递闭包模板。 首先对于每只奶牛,先看它和那些比在它目前手中礼物要珍贵的礼物的主人能否交换,然后做一遍传递闭包,最后对于每只奶牛直接找排名最靠前并且能与自己…

「LG6596-How Many of Them」题解

题解记录P6596 How Many of Them sol 首先发现 \(n\) 特别小(事实上不如题中给出的这么小。。),于是考虑枚举割边数量。 这么做的一个重要根据是存在如下结论:对于一个 \(n\) 个点,已有 \(k\) 个联通块的图,记第…

骗我呢

\(\mathbf{Part. 1}\) 从右往左考虑肯定没啥前途,我们考虑从上往下扫行。对于每一行,它上面的元素肯定都是单调递增的,又知道元素的值域在 \(0\) 到 \(m\),而一行总共有 \(m\) 个数,因此每行可以被表示为 \(0\) 到…

手搓文件管理系统(持续开发中)

#include<bits/stdc++.h> using namespace std;/*** command:* cd [dirname]* to shift to a name_given dir* mkdir [dirname]* create a new dir under current dir* ls [dirname]* list…

AGC001~030 合集

AGC001~030。2025.3.10 - 2025.10.21。 如果附带了题目大意的话就是最近才做,或者是我过了几个月看不懂自己写的啥了重写了一遍。 如果您认为某些题目的理解不够到位,非常欢迎交流!!/kel,虽然应该也不会有人仔细看…

手写体识别

手写数字识别:基于PyTorch的卷积神经网络实现 一、项目概述 使用PyTorch实现一个基于卷积神经网络(CNN)的手写手写数字识别模型,通过MNIST数据集训练,实现对手写数字(0-9)的分类识别。 二、环境依赖Python 3.x PyTo…