题意:

给出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. NSPort与NSRunloop的关系是流与消息调度的关系

    NSPort与NSRunloop的关系是流与消息调度的关系. NSPort 将流插入到消息调度队列: 相当于 Socket将流插入到应用一样 - (void)launchThread { NSPort ...

  2. hook的本质就是在本原可执行文件中加东西

    hook的本质就是在本原可执行文件中加东西. 本质就是添加东西:

  3. 由一道面试题简单扩展 — setTimeout、闭包

    在一个前端公众号,看到这么一个号称简单的面试题: 1.以下程序输出什么? <script type="text/javascript"> function init() ...

  4. kernel zram feature

    what is zram? Zram wiki zram zram(也称为 zRAM,先前称为 compcache)是 Linux 内核的一项功能,可提供虚拟内存压缩.zram 通过在 RAM 内的压 ...

  5. Android 开发者必知的开发资源

    英文原文:Bongzimo  翻译: ImportNew-黄小非 译文链接:http://www.importnew.com/3988.html Android 开发者必知的开发资源 随着Androi ...

  6. debian 9 安装Virtual Box

    1.去官网下载deb包,例如包名: virtualbox-.2_5.2.18-124319_Debian_stretch_amd64.deb 2.安装 .2_5.2.18-124319_Debian_ ...

  7. Shell(五)Shell输入/输出重定向

    Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令 ...

  8. 光盘文件的挂载和yum源配置

    一.挂载光盘文件 1.将光盘推入 2.新建挂载点 mkdir /mnt/cdrom 3.挂载 3.1临时挂载 mount /dev/dcrom /mnt/cdrom 或者 mount  –t  iso ...

  9. vue如何根据返回的值对元素进行样式渲染

    1.最终显示样式: 需要:根据任务状态值,显示不同颜色的原点表示任务状态,以及对优先级的数据,进行☆标记 2.代码实现: 在<el-table-column>中需要显示的内容前面,添加图标 ...

  10. 通过rpm安装jdk

    通过rpm安装,安装在/usr/local 1 .编辑系统环境变量 vi /etc/profile 输入i 加入内容如下: export JAVA_HOME=/usr/local/jdk1.7.0_7 ...