题目链接:

  http://acm.hdu.edu.cn/showproblem.php?pid=4565

题目大意:

  给出a,b,n,m,求出的值,

解题思路:

  因为题目中出现了开根号,和向上取整后求余,所以用矩阵快速幂加速求解过程的时候,会产生误差,就很自然地想到了凑数,因为(a-1)^2<b<a^2,得出0<a-sqrt(b)<1,则无论n取多大,(a-sqrt(b))^n都是小于1的,(a-sqrt(b))^n 与 (a+sqrt(b))^n共轭,两者展开后会相互抵销,所以((a-sqrt(b))^n + (a+sqrt(b))^n)为整数,假设((a-sqrt(b))^n + (a+sqrt(b))^n)用sn表示,则sn*(a+sqrt(b))+(a-sqrt(b)) = Sn+1 - (a^2-b)*Sn-1,进一步得出 Sn+1 = 2*a*Sn - (a*a - b) * Sn-1

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <cmath>
  7. #include <queue>
  8. using namespace std;
  9. #define LL __int64
  10. LL a, b, n, m;
  11. struct mat
  12. {
  13. LL p[][];
  14. };
  15.  
  16. mat mul (mat x, mat y);
  17. mat pow (mat x, mat y, LL z);
  18.  
  19. int main ()
  20. {
  21. mat x, y;
  22. while (scanf ("%I64d %I64d %I64d %I64d", &a, &b, &n, &m) != EOF)
  23. {
  24. memset (x.p, , sizeof(x.p));
  25. memset (y.p, , sizeof(y.p));
  26. x.p[][] = (*(a*a+b)%m+m)%m;//要用long long,int相乘的时候会溢出
  27. x.p[][] = (*a) % m;
  28. y.p[][] = (*a) % m;
  29. y.p[][] = ;
  30. y.p[][] = ((b-a*a)%m+m)%m;
  31. //y.p[1][0] = ((b-a*a)+m)%m;//这样取余是错误的,因为还有可能是负数,害wa了好几次
  32. x = pow (x, y, n-);
  33. printf ("%I64d\n", x.p[][]);
  34. }
  35. return ;
  36. }
  37.  
  38. mat mul (mat x, mat y)
  39. {
  40. int i, j, k;
  41. mat z;
  42. memset (z.p, , sizeof(z.p));
  43. for (i=; i<; i++)
  44. for (j=; j<; j++)
  45. {
  46. for (k=; k<; k++)
  47. z.p[i][j] += x.p[i][k] * y.p[k][j];
  48. z.p[i][j] = (z.p[i][j] + m )% m;
  49. }
  50. return z;
  51. }
  52. mat pow (mat x, mat y, LL z)
  53. {
  54. while (z)
  55. {
  56. if (z % )
  57. x = mul(x,y);
  58. y = mul (y, y);
  59. z /= ;
  60. }
  61. return x;
  62. }

hdu 4565 So Easy! (共轭构造+矩阵快速幂)的更多相关文章

  1. HDU 4565 So Easy!(数学+矩阵快速幂)(2013 ACM-ICPC长沙赛区全国邀请赛)

    Problem Description A sequence Sn is defined as:Where a, b, n, m are positive integers.┌x┐is the cei ...

  2. HDU 5667 构造矩阵快速幂

    HDU 5667 构造矩阵快速幂 题目描述 解析 我们根据递推公式 设 则可得到Q的指数关系式 求Q构造矩阵 同时有公式 其中φ为欧拉函数,且当p为质数时有 代码 #include <cstdi ...

  3. hdu4686 Arc of Dream ——构造矩阵+快速幂

    link: http://acm.hdu.edu.cn/showproblem.php?pid=4686 构造出来的矩阵是这样的:根据题目的ai * bi = ……,可以发现 矩阵1 * 矩阵3 = ...

  4. HDU 5950:Recursive sequence(矩阵快速幂)

    http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:给出 a,b,n,递推出 f(n) = f(n-1) + f(n-2) * 2 + n ^ 4. f ...

  5. HDU 2855 斐波那契+矩阵快速幂

    http://acm.hdu.edu.cn/showproblem.php?pid=2855 化简这个公式,多写出几组就会发现规律 d[n]=F[2*n] 后面的任务就是矩阵快速幂拍一个斐波那契模板出 ...

  6. HDU 1757 A Simple Math Problem (矩阵快速幂)

    题目 A Simple Math Problem 解析 矩阵快速幂模板题 构造矩阵 \[\begin{bmatrix}a_0&a_1&a_2&a_3&a_4&a ...

  7. HDU 3292 【佩尔方程求解 && 矩阵快速幂】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=3292 No more tricks, Mr Nanguo Time Limit: 3000/1000 M ...

  8. HDU 2256 Problem of Precision (矩阵快速幂)(推算)

    Problem of Precision Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  9. HDU 4549 (费马小定理+矩阵快速幂+二分快速幂)

    M斐波那契数列 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Statu ...

随机推荐

  1. linux字符驱动之poll机制按键驱动

    在上一节中,我们讲解了如何自动创建设备节点,实现一个中断方式的按键驱动.虽然中断式的驱动,效率是蛮高的,但是大家有没有发现,应用程序的死循环里的读函数是一直在读的:在实际的应用场所里,有没有那么一种情 ...

  2. ArcGIS Engine 10.2 如何发布服务

    http://blog.csdn.net/arcgis_all/article/details/17376397 1 ArcGIS Engine 10.2 如何发布服务 ArcGIS Engine的代 ...

  3. [Unit Testing] Mock an HTTP request using Nock while unit testing

    When testing functions that make HTTP requests, it's not preferable for those requests to actually r ...

  4. POJ 2545+2591+2247+1338简单水题

    [题意简述]:就是有这种一个序列.就拿当p1 = 2,p2 = 3, p3 = 5,来举例.由这三个数为基准组成的序列是: 2,3,4,5,6,8,9,10,12--如今给你这个序列数组的下标,让你求 ...

  5. Django创建数据表

    Django中创建表. 用的django项目自带的sqlite数据库,创建完毕后将表注冊到jdango.admin,就能够在浏览器在管理了. 在django项目的models.py文件里: from  ...

  6. MUI日期选择控件

    MUI的Demo里面有例子,实际做的时候发现日期老是乱码,调了半天,最后发现引用的CSS错误,例子中引用的是 <link href="Css/mui.picker.min.css&qu ...

  7. 2016/05/16 thinkphp3.2.2 验证码使用

    Think\Verify类可以支持验证码的生成和验证功能. 生成验证码 下面是最简单的方式生成验证码: $Verify =new \Think\Verify(); $Verify->entry( ...

  8. RFC函数设置外部断点

  9. Linux下高并发socket最大连接数所受的各种限制(详解)

    1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每 ...

  10. [Android6.0][RK3399] 电池系统(三)电量计 CW2015 驱动流程分析【转】

    本文转载自:http://blog.csdn.net/dearsq/article/details/72770295 Platform: RK3399 OS: Android 6.0 Kernel: ...