当前位置: 首页 > 编程日记 > 正文

【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂

原文链接 https://www.cnblogs.com/cly-none/p/SRM701Div1C.html

题意:定义"Fibonacci string"为没有连续1的01串。现在,给出\(a,b\),定义一个"Fibonacci string"的权值为\(x^a y^b\),其中\(x\)为0的个数,\(y\)为1的个数。

要求对所有长度为\(n\)的"Fibonacci string"的权值求和,对\(10^9 + 7\)取模。

\(n \leq 10^9, \ a, b \leq 25\)

显然第一反应就是矩阵存下所有\((a,b)\)做快速幂。然而,这样的话矩阵的边长是\(O(a^2)\)的,不能通过本题。

考虑最终答案的式子:
\[ \sum_{k=0}^n {n-k+1 \choose k} k^b (n-k)^a \]
我们尝试化简:
\[ \begin{aligned} & \sum_{k=0}^n {n-k+1 \choose k} k^b (n-k)^a \\ = & \sum_{k=0}^n \sum_{j=0}^a {n-k+1 \choose k} k^b {a\choose j} n^{a-j} (-k)^j \\ = & \sum_{j=0}^a {a \choose j} (-1)^j \sum_{k=0}^n {n-k+1 \choose k}k^{b+j} \end{aligned} \]
注意到后面的\(\sum_{k=0}^n {n-k+1 \choose k} k^{b+j}\)就是当\(a' = 0, \ b' = b+j\)时,所有长度为\(n\)的"Fibonacci string"的权值和。这时,我们再建矩阵,边长就只有\(O(a)\)了。最后\(O(a)\)枚举\(j\)就能计算出答案。

时间复杂度\(O(a^3 \log n)\)

#include <bits/stdc++.h>
using namespace std;const int MOD = (int)(1e9 + 7), N = 110;
struct matrix {int n,m,mat[N][N];matrix(int n=0,int m=0): n(n), m(m) {memset(mat,0,sizeof mat);}matrix operator * (const matrix& a) const {assert(m == a.n);matrix ret = matrix(n, a.m);for (int k = 0 ; k < m ; ++ k)for (int i = 0 ; i < n ; ++ i)for (int j = 0 ; j < a.m ; ++ j)(ret.mat[i][j] += 1ll * mat[i][k] * a.mat[k][j] % MOD) %= MOD;return ret;}
};
matrix power(matrix a,int b) {assert(a.n == a.m);matrix ret = matrix(a.n, a.m);for (int k = 0 ; k < a.n ; ++ k)ret.mat[k][k] = 1;while (b) {if (b&1) ret = ret * a;a = a * a;b >>= 1;}return ret;
}
int power(int a,int b) {int ret = 1;while (b) {if (b&1) ret = 1ll * ret * a % MOD;a = 1ll * a * a % MOD;b >>= 1;}return ret;
}
class FibonacciStringSum {
public:int get( int n, int a, int b ) ;
};
int val[N],cmb[N][N];
int FibonacciStringSum::get(int n, int a, int b) {memset(cmb,0,sizeof cmb);for (int i = 0 ; i <= a + b ; ++ i)cmb[i][0] = 1;for (int i = 1 ; i <= a + b ; ++ i)for (int j = 1 ; j <= i ; ++ j)cmb[i][j] = (cmb[i-1][j] + cmb[i-1][j-1]) % MOD;matrix sta = matrix(1, 2 * (a + b + 1));matrix tran = matrix(2 * (a + b + 1), 2 * (a + b + 1));sta.mat[0][0] = 1;for (int i = 0 ; i <= a + b ; ++ i) {tran.mat[i][i] = 1;tran.mat[i + a + b + 1][i] = 1;for (int j = 0 ; j <= i ; ++ j)tran.mat[j][a + b + 1 + i] += cmb[i][j];}tran = power(tran, n);sta = sta * tran;for (int i = 0 ; i <= a + b ; ++ i)val[i] = (sta.mat[0][i] + sta.mat[0][i + a + b + 1]) % MOD;int ans = 0;for (int i = 0, t = 1 ; i <= a ; ++ i, t = -t)(ans += 1ll * t * cmb[a][i] * power(n, a - i) % MOD * val[b + i] % MOD) %= MOD;ans = (ans % MOD + MOD) % MOD;return ans;
}


小结:这个问题的特殊之处在于,既可以直接矩阵快速幂,也可以写成数学和式。然而,二者都不能直接解决这个问题。把两种方法相结合一直是常用的技巧(如分块),在这里也启示我们对于一个问题不能死板地但从一个方向来思考。

转载于:https://www.cnblogs.com/cly-none/p/SRM701Div1C.html

相关文章:

scala定义抽象类与抽象字段

抽象类 和Java语言一样&#xff0c;scala中也可以定义抽象类 定义&#xff1a; 如果类的某个成员在当前类中的定义是不包含完整的&#xff0c;它就是一个抽象类 不完整定义有两种情况&#xff1a; 1.方法没有方法体&#xff08;抽象方法&#xff09; 2.变量没有初始化&#xf…

kuangbin专题16B(kmp模板)

题目链接: https://vjudge.net/contest/70325#problem/B 题意: 输出模式串在主串中出现的次数 思路: kmp模板 在 kmp 函数中匹配成功计数加一, 再令 j nxt[j] 即可. 感觉有点奇怪的就是我拿 A 题的模板写这题居然会 tle, 而拿这题的模板写 A 题又没有 A 题的模板跑的快...可能…

[转]C#日期格式化 文档

日期转化一 为了达到不同的显示效果有时&#xff0c;我们需要对时间进行转化&#xff0c;默认格式为&#xff1a;2007-01-03 14:33:34 &#xff0c;要转化为其他格式&#xff0c;要用到DateTime.ToString的方法(String, IFormatProvider)&#xff0c;如下所示&#xff1a; usin…

探讨ASP.NET AJAX客户端开发技术

一、 简介 在ASP.NET AJAX组件开发中&#xff0c;存在许多环节有待我们深入挖掘。如何让ASP.NET AJAX服务端控件更有效地利用客户端脚本来为控件添加强大的客户端功能&#xff1f;如何更为方便地访问控件访问的资源&#xff0c;等等。实践证明&#xff0c;要实现最终的应用程序…

mfc 应用程序 语言进行本地化

在软件国际化的今天,资源从代码中独立出来,使在不同语言操作系统下能运行不同语言版本的程序,是很有意义的事. MFC 7.0 及更高版本提供对附属 DLL 的增强支持&#xff0c;该功能有助于创建针对多种语言进行本地化的应用程序。附属 DLL 是一个纯资源 DLL&#xff0c;它包含应用程…

前端优化系列之一:dns预获取 dns-prefetch 提升页面载入速度

问题&#xff1a;怎么做到dns域解析&#xff1f;用于优化网站页面的图片问题&#xff1a;怎么提升网站性能&#xff1f;dns域解析&#xff0c;是提升网站的一个办法。DNS Prefetch&#xff0c;即DNS预获取&#xff0c;是前端优化的一部分。 一般来说&#xff0c;在前端优化中与…

暑假集训D15总结

考试 日常爆炸 T1数据背锅&#xff0c;回天乏力 推了两个小时的T2竟然莫名RE&#xff0c;我也是服了 T3考试时就没读懂题&#xff0c;做个鬼啊 今天一直在写某奇怪的技术贴&#xff0c;竟然没有写题解&#xff08;手动滑稽&#xff09; 希望明天不要乱炸吧 博客 强行推荐一波自…

maven-assembly-plugin和maven-shade-plugin打包区别及弊端

使用 maven 插件 maven-shade-plugin 对可执行 java 工程及其全部依赖 jar 进行打包 maven-shade-pluginmaven-assembly-pluginmavenjar打包 现在基本上都是采用 maven 来进行开发管理&#xff0c;我有一个需求是需要把通过 maven 管理的 java 工程打成可执行的 jar 包&#x…

【Spark】Spark基础练习题(一)

题目&#xff1a; 1、创建一个1-10数组的RDD&#xff0c;将所有元素*2形成新的RDD 2、创建一个10-20数组的RDD&#xff0c;使用mapPartitions将所有元素*2形成新的RDD 3、创建一个元素为 1-5 的RDD&#xff0c;运用 flatMap创建一个新的 RDD&#xff0c;新的 RDD 为原 RDD 每…

Python(27)_字符串的常用的方法2

#-*-coding:utf-8-*-字符串操作s " bowen " # 从右边删 s1 s.rstrip() print(len(s1)) s2 s1.lstrip() print(len(s2)) 从右边删除元素&#xff0c;从左边删除元素&#xff0c;这个在以后项目中经常用到 二、计算个数 #-*-coding:utf-8-*-字符串操作s " bo…

tensorflow1

1、什么是tensorflow tensorflow是一个开源软件库&#xff0c;使用data flow graphs进行数值计算&#xff0c;最初由Google大脑团队开发&#xff0c;用于机器学习和深度卷积网络的研究&#xff0c;同样适用于其他广泛的领域。 2、访问tensorflow官网&#xff1a;在Windows的hos…

大型企业门户网站设计开发一般性原则和建议

[适用范围] 本文所述的原则、建议适用于大型企业信息门户网站的设计和开发&#xff0c;注意不是小型企业网站、一般企业电子商务网站、企业级Web应用系统。 [一般性原则] 一、网站设计原则 第一原则&#xff1a;内容丰富、明确 网站主要是为浏览着提供信息服务的&#xff0c;作…

8月第3周回顾:四巨头发三大新闻 一报告引多家争议

8月15日是51CTO.com成立两周年的日子&#xff0c;网站举办了多种活动进行了庆祝&#xff1b;凑巧的是&#xff0c;IT界在本周也热闹非凡&#xff1a;微软、甲骨文、IBM和Sun联手送上三份重要新闻&#xff1b;国内一份个人安全的报告引起一场小小的风波——这些都足以让关注IT技…

车辆匹配和平均车速计算

数据测试内容以及详情见 https://github.com/xueyeyu/avgsp /* 作者&#xff1a;雪夜羽 平均车速计算&#xff08;sqlserver&#xff09;基于电警 QQ&#xff1a;1412900482 */ import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement…

为何 Map接口不继承Collection接口

1.首先Map提供的是键值对映射&#xff08;即Key和value的映射&#xff09;&#xff0c;而collection提供的是一组数据&#xff08;并不是键值对映射&#xff09;。 如果map继承了collection接口&#xff0c;那么所有实现了map接口的类到底是用map的键值对映射数据还是用collec…

Linux 开机网络无法自动连接配置、网络开机自动连接

第一步&#xff1a;查看开机后网络是否正常连接&#xff1f; 1、图形界面开机后直接看右上角的网络是否连接正常&#xff08;如图一&#xff09;。 图一&#xff08;表示未正常连接↑↑↑↑↑↑↑↑↑&#xff09; 2、如果是命令页面的&#xff0c;可以使用命令查看网络连接情况…

sql中将分隔字符串转为临时表的方法

问题: 要求将 一字符串 0,1,2,3,4,5 &#xff1b;将,分隔后的每一内容转为一行记录到数据库表中declare table_串转数组 table( adapt_object int default 0) declare tmp_str varchar(100) declare tmp_index int select tmp_index 1 select tmp_str 0,1,12,03,4,5,a,…

每天学一点flash(15) xml的一些常见写法

今天下了大雨来了&#xff0c;什么地方去不了&#xff0c;只好将想写的东西都记载下来。 一些常见的一些xml写法&#xff0c;收集目的就是为了代码调试方便&#xff1a; 一&#xff0e;简单数组单值形 <?xml version"1.0" encoding"UTF-8"?> <i…

spark为什么比hive速度快?

spark是什么&#xff1f; spark是针对于大规模数据处理的统一分析引擎&#xff0c;通俗点说就是基于内存计算的框架 spark和hive的区别&#xff1f; spark的job输出结果可保存在内存中&#xff0c;而MapReduce的job输出结果只能保存在磁盘中&#xff0c;io读取速度要比内存中…

kotlin 练习

kotlin基础语法 samychen 关注 2017.05.28 17:07* 字数 1224 阅读 2434评论 0喜欢 6每种编程语言都有一定的语法、语义和执行顺序(同步)&#xff0c;学习一种新语言也都是从这三者出发&#xff0c;下面我们就只针对kotlin的语法来做简单的介绍。 Kotlin有自己的特性不该被Java的…

软件设计之 数据库设计

[按语&#xff1a;在软件设计或是动态网站开发中&#xff0c;数据库设计时很重要&#xff0c;我觉得可以说是开发工作的核心部分&#xff0c;所以学好数据库设计&#xff0c;是很重要的&#xff0c;也是大有前途的。。。]◆&#xff0e;概念首先要搞清楚容易混淆的两个概念&…

css结构思维导图

以下的图是根据css基础&#xff0c;样式&#xff0c;框模型&#xff0c;定位以及选择器这几个方面总结出来的思维导图&#xff0c;方便记忆以及查询。 转载于:https://www.cnblogs.com/yuexiuyi/p/7352516.html

C#类的修饰符

访问修饰符:public&#xff1a;访问不受限制。protected&#xff1a;访问仅限于包含类或从包含类派生的类型。只有包含该成员的类以及继承的类可以存取.Internal&#xff1a;访问仅限于当前程序集。只有当前工程可以存取.protected internal&#xff1a;访问仅限于当前程序集或…

Appium+Python 自动化测试一之:环境安装(Android篇)

目前网上有大量AppiumPython的APP自动化测试的资料&#xff0c;这里我只是记录一下自己安装的过程&#xff0c;好让自己以后忘记的时候再翻起来看看&#xff0c;快速上手&#xff0c;不想再像之前那样踩坑。 注&#xff1a;因为之前玩过Robot FrameworkSelenium2&#xff0c;所…

sql server 2005 T-SQL @@TOTAL_READ (Transact-SQL)

返回 SQL Server 自上次启动后由 SQL Server 读取&#xff08;非缓存读取&#xff09;的磁盘的数目。 Transact-SQL 语法约定 语法 TOTAL_READ 返回类型 integer 备注 若要显示包含多项 SQL Server 统计信息&#xff08;包括读写活动&#xff09;的报表&#xff0c;请运行 sp_m…

存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储

存储结构分四类&#xff1a;顺序存储、链接存储、索引存储 和 散列存储。 顺序结构和链接结构适用在内存结构中。 顺序表每个单元都是按物理顺序排列的&#xff0c;如果你想访问那个单元你可以根据提供的指针等直接访问到需要的东西&#xff0c;但是链表是逻辑连续不是物理连续…

[luoguP2618] 数字工程(DP)

传送门 离线处理。。。 先线性筛一遍。 直接预处理出所有答案。 注意要用push&#xff0c;用乘法&#xff0c;常数小。 #include <cstdio> #include <cstring> #define N 1000001 #define min(x, y) ((x) < (y) ? (x) : (y))int n, cnt; int f[N], prime[N]; b…

QOS的qmtoken 1

在有拥塞的时候高层协议如TCP可能自己可以控制下拥塞&#xff0c;因此你的队列效果可能不明显了&#xff0c;这个时候TCP就是&#xff0c;网络拥塞丢包增加&#xff0c;重传增加。此时可以定义波特率修改接口带宽&#xff0c;从而从底层截掉带宽制作拥塞或使用LR&#xff0c;LR…

关于SQL的基础知识点

文章目录一 了解SQL二 检索数据三 排序检索数据四 过滤数据五 高级数据过滤六 用通配符进行过滤七 创建计算字段八 使用数据处理函数九 汇总数据十 分组数据十一、 子查询十二、 联结表十三、 创建高级联结十四 组合查询十五 插入数据十六 更新和删除数据十七 创建和操纵表十八…

DB-MySQL:MySQL 事务

ylbtech-DB-MySQL&#xff1a;MySQL 事务1.返回顶部 1、MySQL 事务 MySQL 事务主要用于处理操作量大&#xff0c;复杂度高的数据。比如说&#xff0c;在人员管理系统中&#xff0c;你删除一个人员&#xff0c;你即需要删除人员的基本资料&#xff0c;也要删除和该人员相关的信息…