JZOJ 4276【NOIP2015模拟10.28A组】递推
【NOIP2015模拟10.28A组】递推


思路一
对于 \(30%\) 的数据,由于 \(n\) 和 \(x_i\) 都比较小,所以依题暴力枚举每个整点的坐标算贡献即可
思路二
对于额外 \(20%\) 的数据,发现 \(n=1\) 且有数列 \(F\) 为斐波那契数列,于是就变成求 \(\sum_{i=0}^{x_0 - 1}Fib_i\)
于是我们可以矩阵优化求和
思路三
既然提到矩阵,我们不妨顺着这个思路来想
如果只有一维,我们很容易用矩阵加速递推切掉它

那么考虑高维

发现唯一剩下的问题是如何计算括号中的矩阵之和
因为他们出现了等比
于是考虑暂且抛开单位矩阵 \(I\)
记 F = \(A + A^2 + A^3 + A^4 + ... + A^n\)
\(mid = \lfloor \frac{n}{2} \rfloor\)
\left \{
\begin{aligned}
(A + A^2 + A^3 + A^4 + ... + A^{mid})(A^{mid} + I) & & (\texttt{n is even}) \\
(A + A^2 + A^3 + A^4 + ... + A^{mid})(A^{mid} + I) + A^n & & (\texttt{n is odd})
\end{aligned}
\right.
\]
由于题目比较恶心,即使 \(A^n\) 用矩阵快速幂算也会 \(T\) 掉
因为快速幂和分治过程性质一样
所以我们考虑在分治的过程中算出 \(A^n\)
详见代码
\(Code\)
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long LL;
const int N = 15 , M = 45;
const int P = 1e9 + 9;
int n , m , c[M] , f[M];
LL ans;
struct matrix{
int m[M][M];
}A , Q , I , Now , Sum , res;
inline matrix Mul(matrix a , matrix b) //矩阵乘法
{
memset(res.m , 0 , sizeof res.m);
for(register int i = 1; i <= m; i++)
for(register int j = 1; j <= m; j++)
for(register int k = 1; k <= m; k++)
res.m[i][j] = (res.m[i][j] + 1LL * a.m[i][k] * b.m[k][j] % P) % P;
return res;
}
inline matrix Plus(matrix a , matrix b) //矩阵加法
{
memset(res.m , 0 , sizeof res.m);
for(register int i = 1; i <= m; i++)
for(register int j = 1; j <= m; j++)
res.m[i][j] = (a.m[i][j] + b.m[i][j]) % P;
return res;
}
inline matrix divide(int x)
{
if (x == 1) return Q = A;
int mid = x >> 1;
matrix tmp = divide(mid); //分而治之
matrix temp;
temp = Mul(tmp , Q);
tmp = Plus(tmp , temp);
Q = Mul(Q , Q); //平方算A^{2*mid}
if (!(x & 1)) return tmp;
Q = Mul(Q , A); //奇数时再乘个A,和快速幂同理
tmp = Plus(tmp , Q);
return tmp;
}
int main()
{
freopen("recursion.in" , "r" , stdin);
freopen("recursion.out" , "w" , stdout);
scanf("%d%d" , &n , &m);
for(register int i = 1; i <= m; i++) scanf("%d" , &c[i]);
for(register int i = 0; i < m; i++) scanf("%d" , &f[i]);
for(register int i = 1; i <= m; i++) A.m[i + 1][i] = 1 , I.m[i][i] = Sum.m[i][i] = 1;
for(register int i = 1; i <= m; i++) A.m[i][m] = c[m - i + 1];
int x;
for(register int i = 1; i <= n; i++)
{
scanf("%d" , &x);
Q = I;
Now = divide(x - 1);
for(register int j = 1; j <= m; j++) Now.m[j][j] = (Now.m[j][j] + 1) % P; //加上单位矩阵I
Sum = Mul(Now , Sum); //先算括号中的
}
for(register int i = 1; i <= m; i++) //把f乘上来
ans = (ans + 1LL * f[i - 1] * Sum.m[i][1] % P) % P;
printf("%lld" , ans);
}
JZOJ 4276【NOIP2015模拟10.28A组】递推的更多相关文章
- JZOJ 4273. 【NOIP2015模拟10.28B组】圣章-精灵使的魔法语
4273. [NOIP2015模拟10.28B组]圣章-精灵使的魔法语 (File IO): input:elf.in output:elf.out Time Limits: 1000 ms Mem ...
- JZOJ 4272. 【NOIP2015模拟10.28B组】序章-弗兰德的秘密
272. [NOIP2015模拟10.28B组]序章-弗兰德的秘密 (File IO): input:frand.in output:frand.out Time Limits: 1000 ms M ...
- [JZOJ4272] [NOIP2015模拟10.28B组] 序章-弗兰德的秘密 解题报告(树形DP)
Description 背景介绍弗兰德,我不知道这个地方对我意味着什么.这里是一切开始的地方.3年前,还是个什么都没见过的少年,来到弗兰德的树下,走进了封闭的密室,扭动的封尘已久机关,在石板上知道了这 ...
- [JZOJ4274] [NOIP2015模拟10.28B组] 终章-剑之魂 解题报告(二进制)
Description [背景介绍]古堡,暗鸦,斜阳,和深渊……等了三年,我独自一人,终于来到了这里……“终焉的试炼吗?就在这里吗?”我自言自语道.“终焉的试炼啊!就在这里啊!”我再一次自言自语道.“ ...
- JZOJ 4269. 【NOIP2015模拟10.27】挑竹签
4269. [NOIP2015模拟10.27]挑竹签 (File IO): input:mikado.in output:mikado.out Time Limits: 1000 ms Memory ...
- JZOJ 1003 [ 东莞市选 2007 ] 拦截导弹 —— 递推
题目:https://jzoj.net/senior/#main/show/1003 n^2 的话递推就可以啦. 代码如下: #include<iostream> #include< ...
- 【第53套模拟题】【递推】【RMQ】【二进制】【分块】
题目:(开始自己描述题目了...) 第一题大意: 求1~n的所有排列中逆序对为k个的方案数,输出方案数%10000,n<=1000. 解:这道题一个递推,因为我基本上没怎么自己做过递推,所以推了 ...
- 2018.06.29 NOIP模拟 1807(简单递推)
1807 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出一个由数字('0'-'9')构成的字符串.我们说一个子序列是好的,如果他的每一位都是 1.8.0.7 ,并且这四个数字按照 ...
- [jzoj]4271. 【NOIP2015模拟10.27】魔法阵(37种转移的dp)
题意不说 应该这辈子都不会忘记了... 这是我人生中做的最SB的一道DP题. 真的打的我心态崩了.... 可是竟然被我调出来了..... 也是没谁了... 我们设\(F[i][j][S]\)表示到第\ ...
- [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)
Description “我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力.”——<The Grimoire of Marisa>雾雨魔理 ...
随机推荐
- 在C#中使用Halcon开发视觉检测程序
目录 简介 将 HALCON/.NET 添加到应用程序 添加控件 引用dll 调用Halcon算子 程序示例 HSmartWindowControl控件使用 加载.保存图像 扩展:加载相机图像 画线. ...
- 大趋智能打印机java api
对接飞鹅和易联云后 ,网上几乎没资料对大趋智能打印机java api分享,故此分享一波. 官方文档地址 SnParam.java package com.shanheyongmu.openapi.pa ...
- Zabbix与乐维监控对比分析(二)——Agent管理、自动发现、权限管理
上期我们详细介绍了Zabbix与乐维监控的架构与性能对比分析,透过架构与性能对比分析,用户可以对乐维监控之所以能成为"Zabbix企业版"有一个初步的认知.本篇是Zabbix对比乐 ...
- 【实时数仓】Day05-ClickHouse:入门、安装、数据类型、表引擎、SQL操作、副本、分片集群
一.ClickHouse入门 1.介绍 是一个开源的列式存储数据库(DBMS) 使用C++编写 用于在线分析查询(OLAP) 能够使用SQL查询实时生成分析数据报告 2.特点 (1)列式存储 比较: ...
- 【ASP.NET Core】MVC控制器的各种自定义:IActionHttpMethodProvider 接口
IActionHttpMethodProvider 接口的结构很简单,实现该接口只要实现一个属性即可--HttpMethods.该属性是一个字符串序列. 这啥意思呢?这个字符串序列代表的就是受支持的 ...
- pycharm全局搜索
方法有:1.使用[Ctrl+N]快捷键按文件名搜索py文件: 2.使用[Ctrl+shift+N]快捷键按文件名搜索所有类型的文件: 3.使用[ctrl+shift+f]快捷全局字符串搜索: 3.使用 ...
- Web应用怎样获取Access Token?
1.在联盟创建服务器应用 参考文档:开发准备 2.获取用户级Access Token 2.1 获取code 参考文档:接入华为帐号获取凭证 2.1.1 先按照跳转链接进行配置url https://o ...
- Young's theorem杨氏定理
杨氏定理 定理叙述 参考百度百科. Young's Theorem: Let \(f\) be a differentiable function of \(n\) variables. If eac ...
- 体验一个前端视图层的mvvm的框架Knockoutjs(双向绑定,模板..)..解放您的双手,不再处理那么多的dom操作..快速实现视图层数据与UI的交互处理
笔者之前对于类似前端展示的,可能都是自己开发js对象,集合外加dom事件进行处理.. 近期看到相关资料,了解了Knockoutjs这个框架,下面来段代码: <script type=" ...
- day12-功能实现11
家居网购项目实现011 以下皆为部分代码,详见 https://github.com/liyuelian/furniture_mall.git 27.功能25-事务管理 27.1下订单问题思考 在生成 ...