据说这两场加起来只要170= =而这是最简单的题目了QAQ

看到$(\frac {b + \sqrt {d} } {2} )^n$,第一反应是共轭根式$(\frac {b - \sqrt {d} } {2} )^n$

首先有$(\frac {b + \sqrt {d} } {2} )^n + (\frac {b - \sqrt {d} } {2} )^n$为整数

由高中课本知识可知,上式其实是一个三项递推数列的通项公式,而数列的递推式非常简单

$$f[x] = b * f[x - 1] - \frac{b^2 - d} {4} * f[x - 2]$$

其中$f[0] = 2, f[1] = b$,这样子直接矩阵乘法就好啦~

再看$A = (\frac {b - \sqrt {d} } {2} )^n \in [-1, 1]$

然后。。。然后发现bzoj上题面错了QAQ,实际上是"对于20%的数据$b=1,d=5$"

故$A > 0$当且仅当$d \not= b^2$且$n$为偶数,此时要将$f[n]$减掉$1$,否则不用减

  1. /**************************************************************
  2. Problem: 4002
  3. User: rausen
  4. Language: C++
  5. Result: Accepted
  6. Time:48 ms
  7. Memory:1272 kb
  8. ****************************************************************/
  9.  
  10. #include <cstdio>
  11. #include <iostream>
  12. #include <cstring>
  13. #include <algorithm>
  14.  
  15. using namespace std;
  16. typedef unsigned long long ll;
  17. const ll mod = 7528443412579576937ull;
  18.  
  19. template <class T> T sqr(T x) {
  20. return x * x;
  21. }
  22.  
  23. template <class T> T mul(T x, T y) {
  24. static T res;
  25. if (x < y) swap(x, y);
  26. res = ;
  27. while (y) {
  28. if (y & ) res = (res + x) % mod;
  29. x = (x << ) % mod, y >>= ;
  30. }
  31. return res;
  32. }
  33.  
  34. ll b, d, n;
  35.  
  36. struct mat {
  37. ll x[][];
  38.  
  39. inline void clear() {
  40. memset(x, , sizeof(x));
  41. }
  42. inline void one() {
  43. memset(x, , sizeof(x));
  44. x[][] = x[][] = ;
  45. }
  46. inline void pre() {
  47. this -> clear();
  48. x[][] = , x[][] = (d - sqr(b)) >> , x[][] = , x[][] = b;
  49. }
  50.  
  51. inline ll* operator [] (int i) {
  52. return x[i];
  53. }
  54.  
  55. inline mat operator * (const mat &p) const {
  56. static mat res;
  57. static int i, j, k;
  58. for (res.clear(), i = ; i <= ; ++i)
  59. for (j = ; j <= ; ++j)
  60. for (k = ; k <= ; ++k)
  61. res[i][j] = (res[i][j] + mul(x[i][k], p.x[k][j])) % mod;
  62. return res;
  63. }
  64. inline mat& operator *= (const mat &p) {
  65. return *this = *this * p;
  66. }
  67. } a;
  68.  
  69. inline mat pow(const mat &p, ll y) {
  70. static mat x, res;
  71. res.one(), x = p;
  72. while (y) {
  73. if (y & ) res *= x;
  74. x *= x, y >>= ;
  75. }
  76. return res;
  77. }
  78.  
  79. int main() {
  80. cin >> b >> d >> n;
  81. a.pre();
  82. a = pow(a, n);
  83. cout << (((a[][] << ) % mod + mul(b, a[][]) - (d != sqr(b) && !(n & ))) % mod + mod) % mod << endl;
  84. return ;
  85. }

BZOJ4002 [JLOI2015]有意义的字符串的更多相关文章

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

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

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

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

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

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

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

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

  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. 【BZOJ4002】[JLOI2015]有意义的字符串 - 矩阵乘法

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

随机推荐

  1. Codeforces Round #279 (Div. 2) C. Hacking Cypher 前缀+后缀

    C. Hacking Cypher time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  2. 在Yii用createUrl中明明白白生成网址

    在Yii中经常要生成URL,不管是为了自动跳转还是仅仅是一个链接.下面对Yii中的URL生成做了一个总结.提示:以下controllerX代表控制器X,actionX代表方法X.在Controller ...

  3. C++指针内存

    这是一个关于C++指针的问题,思考了一下 void GetMemory(char *p, int num){ p = (char*) malloc (sizeof(char) * num); } vo ...

  4. Win7路由器设置过程

    随着应用win7系统的人越来越多,对于这个系统的应用就更多了,其中大家最关注的就是这个系统和路由器上网的问题.下面,我们就来讲解一下win7系统的路由器的设置过程. 首先打开浏览器,在地址栏输入192 ...

  5. MYSQL中的SELECT查询时进行运算

    SELECT在mysql中是查询表中的数据的作用,但也可以在查询的时候直接进行运算,然后返回查询后的结果 比如 )) FROM username2 其中的IFNULL函数是对adven数据进行判断,若 ...

  6. mysq错误(1)空用户创建库

    mysql5.6.24免安装版: 1.ERROR 1044 (42000): Access denied for user ''@'localhost' to database 现象:创建库失败. 出 ...

  7. Runtime.getRuntime().addShutdownHook

      Runtime.getRuntime().addShutdownHook(shutdownHook); 这个方法的含义说明: 这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会 ...

  8. JavaScript基础知识点

    本书目录 第一章:  JavaScript语言基础 第二章:  JavaScript内置对象第三章:  窗口window对象第四章:  文档document对象第五章:  表单form对象第六章:   ...

  9. (三)stm32之串口通信DMA传输完成中断

    一.DMA功能简介 首先唠叨一下DMA的基本概念,DMA的出现大大减轻了CPU的工作量.在硬件系统中,主要由CPU(内核).外设.内存(SRAM).总线等结构组成,数据经常要在内存和外设之间,外设和外 ...

  10. 【转载】【Centos linux系统】命令行(静默)安装oracle 11gR2

    [原文]:http://blog.chinaunix.net/uid-23886490-id-3565998.html 一.安装前准备 1.内存及swap要求 至于swap如何添加,后文将提到 gre ...