Description

传送门

Solution

由于这里带了小数,直接计算显然会爆掉,我们要想办法去掉小数。

而由于原题给了暗示:b2<=d<=(b+1)2,我们猜测可以利用$(\frac{b-\sqrt{d}}{2})^{n}$的范围为(-1,1)的性质。

则$ans=((\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}=b*a_{n-1}+\frac{(d-b^{2})}{4}*a_{n-2}$

其中,边界a0=2,a1=b。

然后矩阵乘法就好啦。(备注:由于此处两个数相乘会过大,需要用到快速乘法,log(n)的那种)

最后,如果 $(\frac{b-\sqrt{d}}{2})^{n}\geqslant 0$,则由于题目向下取整,可以忽略;

故只有$b^{2}\neq d$且n为奇数才需要对答案减一。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef unsigned long long ull;
const ull mod=7528443412579576937ull;
ull b,d,n;
ull mul(ull a,ull b)
{
ull ans=;
while(b)
{
if(b&) ans=(a+ans)%mod;
b>>=;a=(a+a)%mod;
}
return ans;
}
struct Matrix{ull x[][];
friend Matrix operator*(Matrix a,Matrix b)
{
Matrix c;memset(c.x,,sizeof(c.x));
for (int i=;i<=;i++)
for (int j=;j<=;j++)
for (int k=;k<=;k++)
c.x[i][j]=(c.x[i][j]+mul(a.x[i][k],b.x[k][j]))%mod;
return c;
}
}a;
Matrix ksm(Matrix a,ull t)
{
Matrix ans;memset(ans.x,,sizeof(ans.x));
ans.x[][]=ans.x[][]=;
while (t)
{
if (t&) ans=ans*a;
t>>=;
a=a*a;
}
return ans;
}
ull ans;
int main()
{
scanf("%llu%llu%llu",&b,&d,&n);
if (!n) {printf("");return ;}
a.x[][]=b;
a.x[][]=(d-b*b)/%mod;
a.x[][]=;
a.x[][]=;
a=ksm(a,n-);
ans=(mul(b,a.x[][])+mul(,a.x[][]))%mod;
if (d!=b*b&&!(n&)) ans--;
if (ans<) ans+=mod;
cout<<ans;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法

    题目描述 输入 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 输出 一行一个整数 ...

随机推荐

  1. 2、Python文件操作工具 xlrd 工具

    #打开excel文档workbook = xlrd.open_workbook('..\cye.xls',encoding_override='utf-8') #获取sheet页信息sheet = w ...

  2. jq实现拖拽

    $("body").delegate( ".msg-layer",{ mousedown: function (e) { var el = $(".m ...

  3. 【1】【MOOC】Python游戏开发入门-北京理工大学【第二部分-游戏开发之框架】

    学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...

  4. Counting swaps

    Counting swaps 给你一个1-n的排列,问用最少的交换次数使之变为递增排列的方案数\(mod\ 10^9+7\),1 ≤ n ≤ 10^5. 解 显然最少的交换次数不定,还得需要找到最小交 ...

  5. web-ctf随机数安全

    rand() 函数在产生随机数的时候没有调用 srand(),则产生的随机数是有规律可询的. 产生的随机数可以用下面这个公式预测 : state[i] = state[i-3] + state[i-3 ...

  6. uboot 移植 要点

    1.第一 首先要  学会 shell 语法   比如 变量的 概念 变量的使用 ,if 语法  ,以及简单 IF 语法(与 或预算),以及  while for 循环 等等语法,才能看得懂 uboot ...

  7. 如何使用jquery.qrcode.js插件生成二维码

    1.首先需要准备 jquery.qrcode.js 和 jquery.js github地址:https://github.com/lrsjng/jquery-qrcode 官方文档地址:http:/ ...

  8. xcode10不兼容问题解决方法,framework编译脚本

    XCode10报错:Build/Intermediates.noindex/XCBuildData/build.db": disk I/O error 更改-scheme 为-target ...

  9. Beyond Compare 命令行生成目录下所有文件比对的Html网页report

    MAC环境下,使用Beyond Compare命令行生成两个文件夹差异的html,按目录递归生成. #1. 创建compare #2. 创建compare/old #3. compare/new #4 ...

  10. #leetcode刷题之路31-下一个排列

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列.如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列).必须原地修改,只允许使用额外常数空间. 以下 ...