Fib数列问题(项数很大)

用fib(n)表示斐波那契数列的第n项,现在要求你求fib(n) mod m。fib(1)= 1, fib(2)= 1。

输入格式

输入2个整数n(1≤n≤1018), m(2≤m≤10000000)。

输出格式

输出fib(n)对m取模的值。

样例输入1

4 10

样例输出1

3

样例输入2

100000000 100000000

样例输出2

60546875

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4
 5 struct matrix
 6 {
 7     LL a[105][105];
 8 };
 9 matrix matrix_mul(matrix A, matrix B, LL mod)// 2 个矩阵相乘
10 {
11     matrix C;
12     int i,j,k;
13     for(i=0;i<=1;i++)
14     {
15         for(j=0;j<=1;j++)
16         {
17             C.a[i][j]=0;
18             for(k=0;k<=1;k++)
19             {
20                 C.a[i][j]+=A.a[i][k]*B.a[k][j]%mod;
21                 C.a[i][j]%=mod;
22             }
23         }
24     }
25     return C;
26 }
27 matrix unit() // 返回一个单位矩阵
28 {
29     matrix res;
30     int i,j;
31     for(i=0;i<=1;i++)
32     {
33         for(j=0;j<=1;j++)
34         {
35             if(i==j)
36             res.a[i][j]=1;
37             else
38             res.a[i][j]=0;
39         }
40     }
41     return res;
42 }
43 matrix matrix_pow(matrix A, LL n, LL mod)// 快速求矩阵 A 的 n 次方
44 {
45     matrix res=unit(),temp=A;
46     for(;n;n/=2)
47     {
48         if(n&1)
49         res=matrix_mul(res,temp,mod);
50         temp=matrix_mul(temp,temp,mod);
51     }
52     return res;
53 }
54
55 int main()
56 {
57     LL n,m;
58     scanf("%lld %lld",&n,&m);
59     if(n<3)
60     printf("1\n");
61     else
62     {
63         matrix A,B,C;
64         A.a[0][0]=1; A.a[0][1]=1;
65         A.a[1][0]=1; A.a[1][1]=0;
66         B.a[0][0]=1;
67         B.a[1][0]=1;
68         C=matrix_mul( matrix_pow(A,n-2,m), B, m);
69         printf("%lld\n", C.a[0][0]);
70     }
71     return 0;
72 }

-

原文地址:https://www.cnblogs.com/jiamian/p/12227731.html

时间: 2024-10-09 22:27:46

Fib数列问题(项数很大)的相关文章

给定斐波那契数列的项数求对应的数值的普通方法和优化处理

1 /** 2 给定斐波那契数列的项数求对应的数值 3 参考:剑指Offer 4 */ 5 #include <stdio.h> 6 7 int fib(int n); 8 long long fibonacci(unsigned int n); 9 int main(int argc, const char * argv[]) { 10 11 int n; 12 13 while (1) { 14 15 printf("请输入你想知道到的斐波那契数列的项数:\t"); 1

(hdu step 2.2.1)Fibonacci(求当n很大时的斐波那契数)

题目: Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3036 Accepted Submission(s): 1397   Problem Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] =

FIB数列

斐波那契级数除以N会出现循环,此周期称为皮萨诺周期. 下面给出证明 必然会出现循环 这是基于下面事实: 1. R(n+2)=F(n+2) mod P=(F(n+1)+F(n)) mod P=(F(n+1) mod p +F(n) modp) mod p 2. 斐波那契数列的最大公约数定理:gcd(F(m),F(n))=F(gcd(m,n)) 最大公约数定理表明如果F(k)能被N整除,则F(ik)也能被N整除,这就表明了斐波那契数列所含因子的周期性,下面列举: 因子:2,3,4,5, 6,7,8,

为何很大的浮点大数加一个很小的数计算结果不是预期

通常浮点数被表示成N=S*rj S称为尾数,可正可负,j称为阶码可正可负.r是基数,在计算机中取以2的倍数. 计算机中为了提高精度,进行规格化操作:即假设N=11.0101  则规格化表示为N=0.110101*210表示,因为该规格化使得浮点数的表示精度最高. 机器中浮点数由两部分组成:阶码和尾数.基数为2 阶码由阶符跟阶码组成,尾数由数符跟尾数组成 其中阶码是整数,阶符和阶码的位数m合起来反映浮点数的表示范围及小数点的实际位数.尾数是小数,其位数反映了浮点数的精度. 还有机器零这个概念:即浮

es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

面试题es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?面试官心理分析这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的.很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下 5~10s,坑爹了.第一次搜索的时候,是 5~10s,后面反而就快了,可能就几百毫秒.你就很懵,每个用户第一次访问都会比较慢,比较卡么?所以你要是没玩儿过 es,或者就是自己玩玩儿 demo,被问到这个问题容易懵逼,显示出你对

打印/输入很大的数的方法

有2种方法: (1)长的数据,一般(数据)变量(int long double等)是存不下的,因此,只能存成字符串 char num[128]="1606938044258990275541962092341162602522202993782792835301376" ; cout << num <<endl ; //完成输出! C++ 或 printf( "%s\n", num );//完成输出! C/C++(2)对于64位的大数字:如1

洛谷P3200 [HNOI2009]有趣的数列(Catalan数)

P3200 [HNOI2009]有趣的数列 题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<...<a2n-1,所有的偶数项满足a2<a4<...<a2n: (3)任意相邻的两项a2i-1与a2i(1<=i<=n)满足奇数项小于偶数项,即:a2i-1<a2i. 现在的任务是:对于给定的n,请求出有多少个不同的长度为2n的有趣的数列.因

acm 之fib数列——java

1022. Fib数列 Description 定义Fib数列:1,1,2,3,5,8,13,… 求第N项除以2010的余数 Input Format 输入仅一行,为一个整数N Output Format 输出仅一行,为第N项除以2010的余数 Sample Input 3 Sample Output 2 Limits: 对于70%的数据 N≤1,000,000 对于100%的数据 N≤210,000,000,000 这道题最让人着急的是数太大了,而且不可以使用递归,这种方法会暴栈,但是java

大数据公司挖掘数据价值的49个典型案例!信息量很大

大数据公司挖掘数据价值的49个典型案例 对于企业来说,100条理论确实不如一个成功的标杆有实践意义,本文的主旨就是寻找"正在做"大数据的49个样本. 力图从企业运营和管理的角度,梳理出发掘大数据价值的一般规律:一是以数据驱动的决策,主要通过提高预测概率,来提高决策成功率;二是以数据驱动的流程,主要是形成营销闭环战略,提高销售漏斗的转化率;三是以数据驱动的产品,在产品设计阶段,强调个性化;在产品运营阶段,则强调迭代式创新. 上篇 天然大数据公司的各种套餐 从谷歌.亚马逊.Facebook