题意:

给出b,d,n,求$\lfloor(\frac{b+\sqrt{d}}{2})^n\rfloor \mod 999999999999999989$(原题是7528443412579576937)。

$n\leq 10^{18}$

$0<b^2\leq d<(b+1)^2\leq 10^{18}$

$b \mod 2=1$

$d \mod 4=1$

对于20%的数据有$b=1,d=5$

题解:

我是不知道这题跟字符串有什么关系。。。

场上有40%的数据是$n\leq 5$然而我们都没搞出来。。。
本质是发现性质然后乱搞。。。(这场数学竞赛的本质)

观察式子$(\frac{b+\sqrt{d}}{2})^n$,发现他是一个很像共轭根式的东西,那可以把另一半搞出来,得到

$(\frac{b+\sqrt{d}}{2})^n+(\frac{b-\sqrt{d}}{2})^n$;

显然这个东西一定是整数,不妨设个通项$a_n=(\frac{b+\sqrt{d}}{2})^n+(\frac{b-\sqrt{d}}{2})^n$,则答案就是$a_n-(\frac{b-\sqrt{d}}{2})^n$;

然后我们可以通过一些黑科技用通项把递推式还原出来:把两个共轭根式看成特征方程的两个解,再通过韦达定理就可以把原来的系数解出来。。。

有兴趣的同学可以自己算一下,这里算出来特征方程是$x^2-bx+\frac{b^2-d}{4}=0$,那么还原出来递推式就是

$a_n=b\times a_{n-1}+\frac{d-b^2}{4}\times a_{n-2}$,其中$a_0=2,a_1=b$

所以可以用矩阵快速乘来搞定数列,再考虑后面的$(\frac{b-\sqrt{d}}{2})^n$;

由于数据有$b^2\leq d<(b+1)^2$或$b=1,d=5$,所以$(\frac{b-\sqrt{d}}{2})^n∈(-1,0]$,当且仅当$d≠b^2$且$n$为偶数时要把答案减一。

时间复杂度$O(log^2n)$,但是原题模数爆longlong,所以要手写快速乘。。。

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define eps 1e-4
#define mod 999999999999999989ll
using namespace std;
typedef unsigned long long ull;
struct sq{
ull a[][];
sq(){
a[][]=a[][]=a[][]=a[][]=;
}
void init(){
a[][]=a[][]=;
}
}a,ans;
ull calc(ull x,ull y){
ull ret=;
for(;y;y>>=,x=(x+x>mod)?x+x-mod:x+x){
if(y&)ret=(ret+x>mod)?ret+x-mod:ret+x;
}
return ret;
}
sq operator *(const sq a,const sq b){
sq ret;
for(int i=;i<;i++)for(int j=;j<;j++)for(int k=;k<;k++){
ret.a[i][j]=(ret.a[i][j]+calc(a.a[i][k],b.a[k][j]))%mod;
}
return ret;
}
sq pw(sq x,ull y){
sq ret;
ret.init();
for(;y;y>>=,x=x*x){
if(y&)ret=ret*x;
}
return ret;
}
ull b,d,n;
int main(){
scanf("%llu %llu %llu",&b,&d,&n);
a.a[][]=;
a.a[][]=(d-b*b)/;
a.a[][]=b;
ans.a[][]=;
ans.a[][]=b;
ans=ans*pw(a,n);
if(n%==&&d!=b*b)ans.a[][]--;
printf("%llu",ans.a[][]);
return ;
}

【BZOJ4002】[JLOI2015]有意义的字符串 - 矩阵乘法的更多相关文章

  1. [BZOJ4002][JLOI2015]有意义的字符串-[快速乘法+矩阵乘法]

    Description 传送门 Solution 由于这里带了小数,直接计算显然会爆掉,我们要想办法去掉小数. 而由于原题给了暗示:b2<=d<=(b+1)2,我们猜测可以利用$(\fra ...

  2. BZOJ 4002--有意义的字符串(矩阵乘法)

    4002: [JLOI2015]有意义的字符串 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 963  Solved: 416[Submit][Sta ...

  3. BZOJ4002 [JLOI2015]有意义的字符串

    据说这两场加起来只要170= =而这是最简单的题目了QAQ 看到$(\frac {b + \sqrt {d} } {2} )^n$,第一反应是共轭根式$(\frac {b - \sqrt {d} } ...

  4. bzoj4002 [JLOI2015]有意义的字符串 快速幂

    Description B 君有两个好朋友,他们叫宁宁和冉冉. 有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求((b+sqrt(D)/2)^N的整数部分,请输出结果 Mod 752844341 ...

  5. bzoj4002 [JLOI2015]有意义的字符串 特征根+矩阵快速幂

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4002 题解 神仙题. 根据下面的一个提示: \[ b^2 \leq d \leq (b+1)^ ...

  6. BZOJ4002 [JLOI2015]有意义的字符串 【数学 + 矩乘】

    题目链接 BZOJ4002 题解 容易想到\(\frac{b + \sqrt{d}}{2}\)是二次函数\(x^2 - bx + \frac{b^2 - d}{4} = 0\)的其中一根 那么就有 \ ...

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

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

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

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

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

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

随机推荐

  1. hiho 1476 - 矩形计数 容斥

    题目链接 如图所示,在由N行M列个单位正方形组成的矩形中,有K个单位正方形是黑色的,其余单位正方形是白色的. 你能统计出一共有多少个不同的子矩形是完全由白色单位正方形组成的吗? ----------- ...

  2. DDD中 与Dto搭配的AutoMapper插件,摘自《NET企业级应用架构设计》

    AutoMapper插件 实现了 DTO与Model的互相映射.

  3. 测试用html

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. Python笔记26----正则表达式匹配

    1.语法: 2.题目1:数据类型: 如果要选择 time 为2014-12-18那天的数据:采用正则化来处理 代码:   import re regex = re.compile(r'^2014-12 ...

  5. Map的四种遍历方法

    1.取值遍历 for(String key:map.keySet()){ System.out.println("key="+key+"and value=" ...

  6. (56) 解决字段设为readonly无法保存

    问题描述:当一个字段设为readonly =True 后,在form表单,即使你用onchange方法改变了值但也不能保存到数据库当时.平时在这样的要求,form表单有些字段要展示给用户,但又要达到不 ...

  7. 【henuacm2016级暑期训练-动态规划专题 B】Coloring Trees

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] f[i][j][k]前i个位置,第i个位置放j这个颜色,然后形成了k个联通块的最小花费 分第i个位置有没有已经放颜色两种情况考虑. ...

  8. C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用

    摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...

  9. C#一个托付的样例

    C#中的函数能够被声明的一个托付所调用. 函数为静态方法.和托付声明的參数返回值要一致.   class Program { delegate float MathOperationDelegate( ...

  10. Qt实战之酷狗音乐

    此项目仅仅实现实现基本功能: 界面的模仿. 歌词功能的实现.歌曲在线试听和下载. 专辑写真的播放. 在线歌词搜索.以及主要的button功能. 界面没有採用设计器. 所有手写规划.这里先放出效果图. ...