BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法
BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法
Description
B 君有两个好朋友,他们叫宁宁和冉冉。有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求
.png)
Input
一行三个整数 b;d;n
Output
一行一个数表示模 7528443412579576937 之后的结果。
Sample Input
Sample Output
HINT
其中 0<b^2< = d<(b+1)2< = 10^18,n< = 10^18,并且 b mod 2=1,d mod 4=1
$通过通项式可以求出递推式,具体的,
有递推式Ax_n+Bx_{n-1}+Cx_{n-2}=0$
$用Ax^{2}+Bx+C=0解出x_1,x_2,那么通项为S_n=(k_1*x_1)^{n}+(k_2*x_2)^{n}$
$首先设S_n=(\frac{b+\sqrt{d}}{2})^{n}+(\frac{b-\sqrt{d}}{2})^{n}$
$x_1=\frac{b+\sqrt{d}}{2},x_2=\frac{b-\sqrt{d}}{2}$
$A=1,B=b,C=\frac{b^{2}-d}{4}$
$之后就可以用矩阵乘法求S_n了,并且我们发现(\frac{b-\sqrt{d}}{2})^{n}的取值为[-1,1]$
$它对答案有贡献当且仅当n为偶数,b\not=\sqrt{d}$
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
typedef unsigned long long ll;
typedef double du;
ll mod=7528443412579576937ll,b,d,n;
ll qc(ll x,ll y) {
ll re=0;
while(y>=1) {
if(y&1ll) re=(re+x)%mod;
x=(x+x)%mod;
y>>=1ll;
}
return re;
}
struct Mat {
ll v[2][2];
Mat(){memset(v,0,sizeof(v));}
Mat operator*(const Mat &x)const {
Mat re;int i,j,k;
for(i=0;i<2;i++) {
for(j=0;j<2;j++) {
for(k=0;k<2;k++) {
re.v[i][j]=(re.v[i][j]+qc(v[i][k],x.v[k][j]))%mod;
}
}
}
return re;
}
};
Mat qp(Mat x,ll y) {
Mat I;
I.v[0][0]=I.v[1][1]=1;
while(y>=1) {
if(y&1ll) I=I*x;
x=x*x;
y>>=1ll;
}
return I;
}
int main() {
scanf("%llu%llu%llu",&b,&d,&n);
Mat x;
x.v[0][0]=0; x.v[0][1]=(d-b*b)/4; x.v[1][0]=1; x.v[1][1]=b;
Mat T=qp(x,n);
ll ans=(qc(2,T.v[0][0])+qc(b,T.v[1][0]))%mod;
if(d!=b*b&&n%2==0) ans--;
printf("%llu\n",ans);
}
BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法的更多相关文章
- 【bzoj4002】[JLOI2015]有意义的字符串 数论+矩阵乘法
题目描述 B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 输入 一行三个整数 b;d;n 输出 一行一个数表示模 7528443412579576937 ...
- 【BZOJ4002】[JLOI2015]有意义的字符串(数论,矩阵快速幂)
[BZOJ4002][JLOI2015]有意义的字符串(数论,矩阵快速幂) 题面 BZOJ 洛谷 题解 发现我这种题总是做不动... 令\(A=\frac{b+\sqrt d}{2},B=\frac{ ...
- 【BZOJ4002】[JLOI2015]有意义的字符串 数学
[BZOJ4002][JLOI2015]有意义的字符串 Description B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 Input 一行三个整数 ...
- [JLOI2015]有意义的字符串
4002: [JLOI2015]有意义的字符串 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1000 Solved: 436[Submit][St ...
- B20J_1297_[SCOI2009]迷路_矩阵乘法
B20J_1297_[SCOI2009]迷路_矩阵乘法 题意:有向图 N 个节点,从节点 0 出发,必须恰好在 T 时刻到达节点 N-1.总共有多少种不同的路径? 2 <= N <= 10 ...
- BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法
BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法 Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时H ...
- BZOJ_5015_[Snoi2017]礼物_矩阵乘法
BZOJ_5015_[Snoi2017]礼物_矩阵乘法 Description 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第 一个朋友会带给他 ...
- BZOJ_4870_[Shoi2017]组合数问题_矩阵乘法
BZOJ_4870_[Shoi2017]组合数问题_矩阵乘法 Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ ...
- BZOJ_1712_[Usaco2007 China]Summing Sums 加密_矩阵乘法
BZOJ_1712_[Usaco2007 China]Summing Sums 加密_矩阵乘法 Description 那N只可爱的奶牛刚刚学习了有关密码的许多算法,终于,她们创造出了属于奶牛 ...
随机推荐
- java程序的内存分配(一)
首 页 阅览室 馆友 我的图书馆 帐号 java程序的内存分配(一) 收藏 JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据J ...
- Day15 jss整体结构梳理
JS DOM--- 两个步骤: 1 查找标签 (1)直接查找 document.getElementById("idname") // dom对象 document.getElem ...
- IOS Swift语言开发 tableView的重用以及自cell的自适应高度
http://www.aichengxu.com/iOS/11143168.htm 一.准备数据 (这是一个元组,第一个元素为英雄的名字;第二个元素为英雄头像图片的名字,格式为.PNG,如果为其他的格 ...
- Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析
1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...
- 构建具有用户身份认证的 Ionic 应用
序言:本文主要介绍了使用 Ionic 和 Cordova 开发混合应用时如何添加用户身份认证.教程简易,对于 Ionic 入门学习有一定帮助.因为文章是去年发表,所以教程内关于 Okta 的一些使用步 ...
- Mego(05) - Mego Tools使用教程
前言 使用过EntityFramework6的朋友应该都知道EF中的PowerTools这个工具可以帮助初学者或者开发人员快速构建一个EF的数据上下文,并且可以很直观的看到实体之间的关系.不过目前升级 ...
- springcloud(十):服务网关zuul(转)
前面的文章我们介绍了,Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散,Spring Cloud Config服务集群配置中心,似乎一个 ...
- Ractive 的 认识
1 前言 Ractive.js是一款入门容易却功能强大的JS库,它的主旨是模板+数据=UI,数据的双向绑定,DOM节点的实时更新,事件处理等多个有用的功能.它吸取了AngularJS中的一些灵感,因此 ...
- 《Hadoop金融大数据分析》读书笔记
<Hadoop金融大数据分析> Hadoop for Finance Essentials 使用Hadoop,是因为数据量大数据量如此之多,以至于无法用传统的数据处理工具和应用来处理的数据 ...
- mysql left join 左连接查询关联n多张表
left join 左连接即以左表为基准,显示坐标所有的行,右表与左表关联的数据会显示,不关联的则不显示.关键字为left join on. **基本用法如下: select table a left ...