NOJ 1019 Fibonacci II
来源:互联网 发布:永久域名发布网器 编辑:程序博客网 时间:2024/05/22 02:28
题目大意
题目链接:http://acm.nit.net.cn/showproblem.jsp?pid=1019
求第n个斐波那契数列对m求余的值。
题目分析
题目类型:矩阵乘法、分治、数据结构。
题目分析:n可能很大,而且不知道m是多少,F(n)可能超过64位,所以不能先储存好再算。同样如果每次输入一次都计算一次的话,计算次数会很多,会超时。这是就想到斐波那契数列的另一种表现形式:矩阵形式。这样完成了加法到乘法的转变,但是速度还没优化。这时想到一个O(log(n))算法:分治,这样时间就不会超,题目就解决了。
通过代码
- # include "stdio.h"
- int m;
- typedef struct
- {
- int r11,r12,r21,r22;
- }mue;
- mue mul(mue a,mue b)
- {
- mue c;
- c.r11=(a.r11*b.r11+a.r12*b.r21)%m;
- c.r12=(a.r11*b.r12+a.r12*b.r22)%m;
- c.r21=(a.r21*b.r11+a.r22*b.r21)%m;
- c.r22=(a.r21*b.r12+a.r22*b.r22)%m;
- return c;
- }
- mue fib(mue a,int n)
- {
- mue r;
- if(n==0) { r.r11=1,r.r12=0,r.r21=0,r.r22=1; return r;}
- if(n==1) { return a;}
- if(n%2) { return mul(fib(mul(a,a),n/2),a);}
- else return fib(mul(a,a),n/2);
- }
- int main ()
- {
- int n;
- while(scanf("%d%d",&n,&m)!=-1)
- {
- mue r;
- r.r11=1,r.r12=1,r.r21=1,r.r22=0;
- r=fib(r,n-1);
- printf("%d/n",r.r11);
- }
- return 0;
- }
- NOJ 1019 Fibonacci II
- NOJ Fibonacci数
- 【Codeforces633H】Fibonacci-ish II
- NOJ [1201] Chihuo II - Eating in China
- NOJ 比赛成绩查询问题II hash_map
- Noj
- NOJ 1984 比赛现场气氛营造问题II (完全背包)
- uva 11161 - Help My Brother (II)(Fibonacci)
- NOJ [1019] 拔树 模拟小水题
- Manthan, Codefest 16 H. Fibonacci-ish II (暴力)
- NOJ 比赛成绩查询问题II 另一种解法 双hash_map AC
- NOJ——1627Alex’s Game(II)(尺取)
- Fibonacci
- fibonacci
- Fibonacci
- Fibonacci
- Fibonacci
- fibonacci
- 大流量的网站如何解决访问量的问题
- 中国通信产业链全扫描
- SQL(结构化查询语言)基础
- 菜鸟看代码江湖
- 软件工程的迷茫
- NOJ 1019 Fibonacci II
- 对话框与控件的消息处理顺序
- 学习java
- (转)对Linux内核中进程上下文和中断上下文的理解
- C#---线程池学习总结(未完。。。。)
- 初学Macromedia Dreamweaver
- (转51CTO)C#异步套接字实现原理
- 递归法实现进制转换
- C++拷贝构造函数(深拷贝,浅拷贝)