题面

Railgun

\(T\) 组测试数据,每次给定 \(n,k\),求(\(F(i)\) 为斐波那契数列第 \(i\) 项):

\[\sum_{1\le x_i\le n(1\le i\le k)}F(\sum x_i-k+1)
\]

数据范围:\(1\le T\le 100\),\(1\le n,k\le 10^9\)。


蒟蒻语

小蒟蒻上午的训练赛头很晕,于是就一直在干这题。

推了 \(10\) 页草稿纸,推出了很多巧妙的东西(

可惜,天有绝蒻之路,小蒟蒻最后没做出来,幸得爆零。

赛后神仙教了蒟蒻做法,太巧妙了,比出题人的题解强好多倍。


蒟蒻解

把所有 \(x_i\) 都 \(-1\),开始推式:

\[\begin{split}
&\sum_{0\le x_i\le n-1}F(\sum x_i+1)\\
=&\sum_{0\le x_i\le n-1}
\begin{bmatrix}
1&0\\
\end{bmatrix}
\begin{bmatrix}
1&1\\
1&0\\
\end{bmatrix}
^{\sum x_i}
\begin{bmatrix}
1\\
0\\
\end{bmatrix}\\
=&
\begin{bmatrix}
1&0\\
\end{bmatrix}
\left(
\sum_{0\le x_i\le n-1}
\begin{bmatrix}
1&1\\
1&0\\
\end{bmatrix}
^{\sum x_i}
\right)
\begin{bmatrix}
1\\
0\\
\end{bmatrix}\\
=&
\begin{bmatrix}
1&0\\
\end{bmatrix}
\left(
\sum_{i=0}^{n-1}
\begin{bmatrix}
1&1\\
1&0\\
\end{bmatrix}
^i
\right)^k
\begin{bmatrix}
1\\
0\\
\end{bmatrix}
\end{split}
\]

现在唯一的问题是,如何 \(\Theta(\log n)\) 求出 \(\sum\limits_{i=0}^{n-1}\begin{bmatrix}1&1\\1&0\\\end{bmatrix}^i\)?

当 \(i=0\) 的时候,\(\begin{bmatrix}1&1\\1&0\\\end{bmatrix}^i=E\),\(E\) 是单位矩阵,\(E_{i,i}=1\),其他位置为 \(0\)。

神仙的做法是倍增,维护:

\[sm_k=\sum_{i=0}^{2^k-1}\begin{bmatrix}1&1\\1&0\\\end{bmatrix}^i
\]

然后这个东西是可以 \(\Theta(\log n)\) 递推的,于是 \(\sum\limits_{i=0}^{n-1}\begin{bmatrix}1&1\\1&0\\\end{bmatrix}^i\) 就可以 \(\Theta(\log n)\) 计算了。

另一种方法是矩阵开两倍空间,做矩阵快速幂求矩阵。

但是无论用哪种方法,求矩阵的 \(k\) 次幂还是要矩阵快速幂的。


代码

#include <bits/stdc++.h>
using namespace std; //Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair(a,b)
#define x first
#define y second
#define be(a) a.begin()
#define en(a) a.end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f; //Data
const int mod=1e9+7; //Matrix
const int M=2;
struct Matrix{
int arr[2][2];
Matrix(){memset(arr,0,sizeof arr);}
Matrix(int x,int y,int z,int w){
arr[0][0]=x,arr[0][1]=y;
arr[1][0]=z,arr[1][1]=w;
}
int*operator[](int x){return arr[x];}
friend Matrix operator+(Matrix a,Matrix b){
Matrix res;
for(int i=0;i<M;i++)
for(int j=0;j<M;j++)
res[i][j]=(a[i][j]+b[i][j])%mod;
return res;
}
friend Matrix operator*(Matrix a,Matrix b){
Matrix res;
for(int k=0;k<M;k++)
for(int i=0;i<M;i++)
for(int j=0;j<M;j++)
(res[i][j]+=(ll)a[i][k]*b[k][j]%mod)%=mod;
return res;
}
};
const Matrix E(1,0,0,1);
Matrix Pow(Matrix a,int x){
Matrix res(E);
for(;x;a=a*a,x>>=1)if(x&1) res=res*a;
return res;
}
void Print(Matrix a){
cout<<"++++++++++++\n";
cout<<a[0][0]<<','<<a[0][1]<<'\n';
cout<<a[1][0]<<','<<a[1][1]<<'\n';
cout<<"------------\n";
}
Matrix key(1,0,0,0);
Matrix pa[32],sm[32]; //Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
sm[0]=E,pa[0]=Matrix(1,1,1,0);
for(int i=1;i<32;i++){
pa[i]=pa[i-1]*pa[i-1];
sm[i]=sm[i-1]+pa[i-1]*sm[i-1];
}
// for(int i=0;i<5;i++){
// cout<<"i="<<i<<'\n';
// Print(sm[i]),Print(pa[i]);
// }
int T; cin>>T;
while(T--){
int n,k; cin>>n>>k;
Matrix res;
for(int i=0;i<32;i++)if(n>>i&1)
res=res*pa[i]+sm[i];
res=key*Pow(res,k)*key;
cout<<res[0][0]<<'\n';
}
return 0;
}

祝大家学习愉快!

题解-Railgun的更多相关文章

  1. YAOI Round #5 题解

    前言 比赛链接: Div.1 : http://47.110.12.131:9016/contest/13 Div.2 : http://47.110.12.131:9016/contest/12 D ...

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

随机推荐

  1. 聊一聊Token

    阔别了一阵,再次提笔,有些感慨. 聊聊Token吧,以前工作中总是遇到. 首先明确什么是token? 一些关键标签:服务端签发的一个字符串,客户端的请求令牌,用户第一次使用用户名密码登录后生成,在to ...

  2. ceph使用memdisk做journal

    记得在很久很久以前,ceph当时的版本是有提供使用内存做journal的配置的,当时是使用的tmpfs,但是现在的版本在搜资料的时候,发现关于这个的没怎么找到资料,邮件列表里面有人有提到怎么做,看了下 ...

  3. RTSP服务端开发概述

    一 概述 RTSP(Real Time Streaming Protocol),RFC2326,实时音视频流传输协议,是TCP/IP协议体系中的一个应用层协议.该协议定义了一对多应用程序如何有效地通过 ...

  4. 如何使用iMindMap制作更专业的时间计划

    时间计划无论是在日常生活中,还是在工作中,都显得极为重要.小到每周的购物时间规划,大到大型项目的时间管理,时间计划都会如影随形.虽然时间计划很重要,但很多人都会忽视这种重要性,可能只会在台本日历上作一 ...

  5. Camtasia快捷键大全

    Camtasia是一款专业屏幕录制软件,它能在任何颜色模式下轻松地记录屏幕动作,另外它还具有即时播放和编辑压缩的功能.在生活上应用范围相当的广泛.在实际运用中如果能了解到相关的快捷键知识,相信是一定程 ...

  6. MAC系统网页链接如何下载

    Folx 5 是一款简单易用.功能强大的Mac OS系统的下载管理器.Folx界面简洁,下载管理方便,支持网页链接下载.BT下载和YouTube下载,而且还可以设置计划任务.搜索BT种子以及添加Tra ...

  7. 为什么思维导图软件MindManager成为了企业培训必备的工具

    企业培训,无论是前期准备.中间的演讲演示.还是后期的总结整理等.MindManager都可以以不同的形式,给你更好的培训方式.下面就来看看MindManager是怎么协助企业培训的吧: 前期准备--制 ...

  8. MarkDown学习总结-2020.05.11

    1.使用工具 1.1Typora 官网地址:https://www.typora.io/ 下载链接 2.基础入门 注意: []中的内容则是对应格式的标记符,默认全部标识符后面需要多加一个空格才能生效. ...

  9. flink:StreamGraph转换为JobGraph

    1 转换基本流程 2 简单来看可以分为两部分: 第一部分是通过一些util.translator.generator等类将职责进行解耦.托管和分离,期间涉及FlinkPipelineTranslati ...

  10. 《HelloGitHub》第 56 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...