BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法

Description

B 君有两个好朋友,他们叫宁宁和冉冉。有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求

Input

一行三个整数 b;d;n

 

Output

一行一个数表示模 7528443412579576937 之后的结果。

Sample Input

1 5 9

Sample Output

76

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]有意义的字符串_矩阵乘法的更多相关文章

  1. 【bzoj4002】[JLOI2015]有意义的字符串 数论+矩阵乘法

    题目描述 B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 输入 一行三个整数 b;d;n 输出 一行一个数表示模 7528443412579576937 ...

  2. 【BZOJ4002】[JLOI2015]有意义的字符串(数论,矩阵快速幂)

    [BZOJ4002][JLOI2015]有意义的字符串(数论,矩阵快速幂) 题面 BZOJ 洛谷 题解 发现我这种题总是做不动... 令\(A=\frac{b+\sqrt d}{2},B=\frac{ ...

  3. 【BZOJ4002】[JLOI2015]有意义的字符串 数学

    [BZOJ4002][JLOI2015]有意义的字符串 Description B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 Input 一行三个整数 ...

  4. [JLOI2015]有意义的字符串

    4002: [JLOI2015]有意义的字符串 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1000  Solved: 436[Submit][St ...

  5. B20J_1297_[SCOI2009]迷路_矩阵乘法

    B20J_1297_[SCOI2009]迷路_矩阵乘法 题意:有向图 N 个节点,从节点 0 出发,必须恰好在 T 时刻到达节点 N-1.总共有多少种不同的路径? 2 <= N <= 10 ...

  6. BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法

    BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法 Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时H ...

  7. BZOJ_5015_[Snoi2017]礼物_矩阵乘法

    BZOJ_5015_[Snoi2017]礼物_矩阵乘法 Description 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第 一个朋友会带给他 ...

  8. BZOJ_4870_[Shoi2017]组合数问题_矩阵乘法

    BZOJ_4870_[Shoi2017]组合数问题_矩阵乘法 Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ ...

  9. BZOJ_1712_[Usaco2007 China]Summing Sums 加密_矩阵乘法

    BZOJ_1712_[Usaco2007 China]Summing Sums 加密_矩阵乘法 Description     那N只可爱的奶牛刚刚学习了有关密码的许多算法,终于,她们创造出了属于奶牛 ...

随机推荐

  1. Orcale 存储过程实践总结

    由于项目中用到存储过程,这两天把存储过程方面的知识简单回顾了一下并分享给大家. 编写第一个存储过程 create or replace procedure ky_proc_in_out(para3 i ...

  2. H5之postMessage 。实现跨域

    对于跨域我们有很多的解决方案,今天我来分享一下postMessage的那点事,postMessage是html5新增的一个解决跨域的一个方法,不过很可惜万恶的ie6,7不支持 postMessage( ...

  3. 原生Eclipse下Java服务器调试的一个问题

    当你对Server的配置修改以后,最好到 workspacedir\.metadata\.plugins\org.eclipse.wst.server.core\tmp0目录下把缓存文件给删除了,否则 ...

  4. Android 众多的布局属性详解

    http://www.open-open.com/lib/view/open1328686184311.html Android功能强大,界面华丽,但是众多的布局属性就害苦了开发者,下面这篇文章结合了 ...

  5. Git忽略远程已存在的文件

    git设置本地忽略时远程上不存在本地忽略的文件,git将忽略.如果远程分支上存在这个文件,本地在设置ignore将不起作用.换句话说git本地忽略文件必须保证git的远程仓库分支上没有这个要忽略的文件 ...

  6. SOFA 源码分析 —— 服务发布过程

    前言 SOFA 包含了 RPC 框架,底层通信框架是 bolt ,基于 Netty 4,今天将通过 SOFA-RPC 源码中的例子,看看他是如何发布一个服务的. 示例代码 下面的代码在 com.ali ...

  7. c# 多线程编程中AutoResetEvent和ManualResetEvent

    作为等同于Java的wait,notify,notifyAll的存在,AutoResetEvent和ManualResetEvent分别实现了notify和notifyAll的功能,下面的代码简单讲解 ...

  8. 原生javascript写自己的运动库(匀速运动篇)

    网上有很多JavaScript的运动库,这里和大家分享一下用原生JavaScript一步一步写一个运动函数的过程,如读者有更好的建议欢迎联系作者帮助优化完善代码.这个运动函数完成后,就可以用这个运动函 ...

  9. XSS(跨域脚本攻击)应对之道

    1.概念 xss一般分为两类,反射型和存储型. 反射型xss指的是客户端的不安全输入而引起的攻击,例如: 在某网站搜索,搜索结果会显示搜索的关键词,搜索时关键词填入<script>aler ...

  10. Unity3D学习(六):《Unity Shader入门精要》——Unity的基础光照

    前言 光学中,我们是用辐射度来量化光. 光照按照不同的散射方向分为:漫反射(diffuse)和高光反射(specular).高光反射描述物体是如何反射光线的,漫反射则表示有多少光线会被折射.吸收和散射 ...