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. python面向对象之类成员

    面向对象编程: OOP编程是利用类和对象来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得简单,并可以大大提高程序开发效率.另外,基于面向对象的程序可 ...

  2. js字符串和数组

    sustr  substring  slice的联系与区别 str.substr(2,5) //从索引2开始截取5个字符,原有字符串str不变 str.substring(2,5) //从索引2开始截 ...

  3. angularJs的作用域和依赖注入

    一.angularJs的作用域 &scope这是局部作用域,先在局部作用域中找,如果没有就在全局作用域中找  &rootScope这是全局作用域 <!DOCTYPE HTML&g ...

  4. ZOJ-3279 Ants 树状数组 + 二分

    题目链接: https://cn.vjudge.net/problem/ZOJ-3279 题目大意: 有1到n 那个level 每一个level有a[i]只蚂蚁两种操作 p a b 把第a个level ...

  5. HDU 1079 Calendar Game (博弈论-sg)

    版权声明:欢迎关注我的博客,本文为博主[炒饭君]原创文章.未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/32336485 C ...

  6. 通过代码退出IOS程序

    -(void) tapClick:(UITapGestureRecognizer *)tap{ [UIViewbeginAnimations:@"exitApplication"c ...

  7. iOS 利用KeyChain+ IDFV + BundleID 来作为UUID,保证传给服务端的UUID唯一

    查了相关资料,发现只有KeyChain + IDFV可以保证UUID唯一,参考以下代码 , UICKeyChainStore + (NSString*)identifierForVender{ UIC ...

  8. 自己做的js甘特图插件

    版权所有,禁止转载 内容都在代码中,上图上代码! 代码 <!DOCTYPE html> <html> <head> <title>ganttu.html ...

  9. Python 基础 函数

    python 什么是函数 Python不但能非常灵活地定义函数,而且本身内置了很多有用的函数,可以直接调用.   python 函数的调用 Python内置了很多有用的函数,我们可以直接调用. 要调用 ...

  10. #leetcode刷题之路32-最长有效括号

    给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1:输入: "(()"输出: 2解释: 最长有效括号子串为 "()"示 ...