hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)

时间:2022-09-15 19:55:25

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549;

题目是中文的很容易理解吧。可一开始我把题目看错了,这毛病哈哈。 一开始我看错题时,就用了一个快速幂来解,不用说肯定wa,看题目的通过率也不高,我想会不会有啥坑啊。然而我就是那大坑,哈哈。

不说了,直接说题吧,先讨论k=1,2,3;时的解。这应该会解吧,不多说了;

从第四项开始f(4)=a^1+b^2;f(5)=a^2+b^3;f(6)=a^3+b^5......; 看出来了吧,a上的指数成斐波那契数列,b的也成,而且a的指数是b的前一项;

那么就打表求斐波那契数列呗,不敢,范围太大,又爆内存又超时的。

f(n)=a^k(n-4)+b^k(n-3);其中n>=4;k(0)=1;k(1)=2;

用矩阵来求斐波那契数列的相邻两项有[k[n-2],k[n-1]]*[0 1]

[1 1]

上式等于[k[n-1],k[n]];

那么要求[k[n-4],k[n-3]]=[1,2]*[0 1]^(n-3)

[1 1]

这样就可以用矩阵快速幂来求k[n-4],k[n-3]了;

但光这样还不够,在矩阵快速幂过程中还得取模,不然会溢出。

由费马小定理在p为素数的情况下对任意的整数x都有x^p==x(mod p)

;如果x不能被p整除有x^(p-1)=1(mod p);由于a,b<1e9;所以不能被1e9+7整除, 求出了k[n],则a^k[n]%p=a^(k[n]%(p-1))%p;

证明如下: k[n]=m*(p-1)+d;那么a^k[n]%p=a^[(m*(p-1))+d]%p=(a^[m*(p-1)]%p*a^(d)%p)%p;

由费马小定理可知a^(m*(p-1))%p=1; 而d=k[n]%(p-1);得证;

所以矩阵快速幂时要对1e+6取模就行了; 当k(n)求出来是再进行快速幂运算就可以了,复杂度为2*log2(n); 注意要开longlong不然会溢出。

下面看代码:

  1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<stdlib.h>
6 #include<math.h>
7 const long long N=1e9+7;
8 const long long M=1e9+6;
9 typedef long long ll;
10 void kk(ll y);
11 ll pp(ll x,ll y);
12 ll b[2][2];
13 ll a[2][2];
14 using namespace std;
15 int main(void)
16 {
17 ll i,j,k,p,q,n,m;
18
19 while(scanf("%lld%lld%lld",&p,&q,&k)!=EOF)
20 {
21 if(k==0)
22 {
23 printf("%lld\n",p%N);
24
25 }
26 else if(k==1)
27 {
28 printf("%lld\n",q%N);
29
30 }
31 else if(k==2)
32 {
33 printf("%lld\n",(p%N*q%N)%N);
34 }
35 else
36 {
37 k=k-3;
38 kk(k);
39 ll p1=(b[0][0]%M+2*b[1][0]%M)%M;//求的k(n-4)
40 ll p2=(b[0][1]%M+2*b[1][1]%M)%M;//k[n-3]
41 ll x1=pp(p,p1);//a^k(n-4);
42 ll x2=pp(q,p2);//b^k(n-3);
43 ll dd=(x1*x2)%N;//d=(a^k(n-4)*b^k(n-3))%N;
44 printf("%lld\n",dd);
45
46 }
47
48 }
49
50 return 0;
51
52 }
53
54 ll pp(ll x,ll y)//快速幂
55 {
56 ll p=x;
57 ll q=1;
58
59 while(y)
60 {
61 if(y&1)
62 {
63 q=(q%N*p%N)%N;
64 }
65 p=(p%N*p%N)%N;
66
67 y=y/2;
68 }
69 return q;
70
71 }
72
73
74 void kk(ll y)//矩阵快速幂 形式和快速幂基本一样。
75 {
76 ll i,j,k;
77 ll x1,x2,x3,x4;
78 a[0][0]=0;//a为变换矩阵;
79 a[0][1]=1;
80 a[1][0]=1;
81 a[1][1]=1;
82 b[0][0]=1;//b为单位阵;
83 b[0][1]=0;
84 b[1][0]=0;
85 b[1][1]=1;
86
87 while(y)
88 {
89 if(y&1)
90 {
91 x1=((b[0][0]*a[0][0])%M+(b[0][1]*a[1][0])%M)%M;
92 x2=((b[0][0]*a[0][1])%M+(b[0][1]*a[1][1])%M)%M;
93 x3=((b[1][0]*a[0][0])%M+(b[1][1]*a[1][0])%M)%M;
94 x4=((b[1][0]*a[0][1])%M+(b[1][1]*a[1][1])%M)%M;
95 b[0][0]= x1;
96 b[0][1]=x2;
97 b[1][0]=x3;
98 b[1][1]=x4;
99 }
100 x1=((a[0][0]*a[0][0])%M+(a[0][1]*a[1][0])%M)%M;
101 x2=((a[0][0]*a[0][1])%M+(a[0][1]*a[1][1])%M)%M;
102 x3=((a[1][0]*a[0][0])%M+(a[1][1]*a[1][0])%M)%M;
103 x4=((a[1][0]*a[0][1])%M+(a[1][1]*a[1][1])%M)%M;
104 a[0][0]=x1;
105 a[0][1]=x2;
106 a[1][0]=x3;
107 a[1][1]=x4;
108 y/=2;
109
110 }
111
112
113
114
115 }

hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)的更多相关文章

  1. HDU 4549 M斐波那契数列(矩阵快速幂&plus;费马小定理)

    M斐波那契数列 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submi ...

  2. &lbrack;HDU 4549&rsqb; M斐波那契数列

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  3. HDU 4549 M斐波那契数列(矩阵快速幂)

    题目链接:M斐波那契数列 题意:$F[0]=a,F[1]=b,F[n]=F[n-1]*F[n-2]$.给定$a,b,n$,求$F[n]$. 题解:暴力打表后发现$ F[n]=a^{fib(n-1)} ...

  4. hdu 4549 M斐波那契数列 矩阵快速幂&plus;欧拉定理

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Problem ...

  5. POJ3070 斐波那契数列递推 矩阵快速幂模板题

    题目分析: 对于给出的n,求出斐波那契数列第n项的最后4为数,当n很大的时候,普通的递推会超时,这里介绍用矩阵快速幂解决当递推次数很大时的结果,这里矩阵已经给出,直接计算即可 #include< ...

  6. hdu 4549 M斐波那契数列(矩阵高速幂,高速幂降幂)

    http://acm.hdu.edu.cn/showproblem.php?pid=4549 f[0] = a^1*b^0%p,f[1] = a^0*b^1%p,f[2] = a^1*b^1%p... ...

  7. HDU 4549 M斐波那契数列(矩阵幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4549 题意:F[0]=a,F[1]=b,F[n]=F[n-1]*F[n-2]. 思路:手算一下可以发现 ...

  8. Tribonacci UVA - 12470 (简单的斐波拉契数列)(矩阵快速幂)

    题意:a1=0;a2=1;a3=2; a(n)=a(n-1)+a(n-2)+a(n-3);  求a(n) 思路:矩阵快速幂 #include<cstdio> #include<cst ...

  9. HDU 1316 (斐波那契数列,大数相加,大数比较大小)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1316 Recall the definition of the Fibonacci numbers: ...

随机推荐

  1. &lbrack;转&rsqb; Windows下编译OpenSSL

    简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...

  2. 批处理(&period;bat)For命令使用

    for命令使用 @echo off REM 打印当前目录里所有子目录的名称 REM for /d %%i in (*) do @echo %%i REM 打印当前目录里所有名字为3个字符的子目录的名称 ...

  3. 第15章 使用Postfix与Dovecot收发电子邮件

    章节概述: 本章节从电子邮局系统的组成角色开始讲起,了解MUA.MTA与MDA的作用,熟悉熟悉SMTP.POP3与IMAP4邮局协议. 学习postfix与dovecot服务程序的使用方法并逐条讲解配 ...

  4. IIS &lpar;安装SSL证书后&rpar; 实现 HTTP 自动跳转到 HTTPS

    IIS 里 安装好 SSL 证书后,如何实现 在浏览器里录入 http://www.xxx.com,会自动跳转到 https://www.xxx.com 呢. 首先,下载并安装 IIS 扩展: URL ...

  5. Git实战手册&lpar;三&rpar;&colon; stash解惑与妙用

    0. 介绍 教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步原文地址 有空就来看看个人技术小站, 我一直都在 在实际项目开发中,总会遇到代码写到一半(没法去打commit),去开启新 ...

  6. NPC问题及证明

    致谢:http://www.docin.com/p-1902790324.html

  7. mysql的又一个让人捉摸不透的bug?

    这次就不说很多没有写博客了,因为前几天已经写过了.\^o^/ 昨天我们刚讨论了关于自动化运维工作的实现方式,如果批量执行,中间出错怎么办?突然有人提出mysql支持--force,可以跳过出错继续执行 ...

  8. 字符编码问题mysql

    2019-02-27 07:32:17.108 ERROR 21745 --- [nio-8086-exec-2] c.h.h.rest.configurer.WebMvcConfigurer : 接 ...

  9. Handler实例

    Handler使用例1这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中.本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s会继 ...

  10. jenkins &plus;gitlab 自动化代码秒级上线

    一,配置脚本 #!/bin/bash #目标服务器IP地址 host=$ #job名称 job_name=$ #包名 name=web-$(date +)) #打包 cd /var/lib/jenki ...