Fibonacci poj-3070

    题目大意:求Fibonacci第n项。

    注释:模数为10000,$1\le n \le 10^9$。

      想法:矩阵题,用例题6的想法,我们构造矩阵

          $\begin{pmatrix} 0 & 1 \\ 1 & 1 \end{pmatrix}$

        然后,我们快速幂即可。

      附上lijinnn的版子

struct Matr
{
int a[4][4];
Matr(){memset(a,0,sizeof a);}
Matr operator *(const Matr &z)
{
Matr re;
int p=2;
for(int i=0;i<p;++i)
{
for(int j=0;j<p;++j)
{
for(int k=0;k<p;++k)
{
re.a[i][j]=(re.a[i][j]+a[i][k]*z.a[k][j])%mod;
}
}
}
return re;
}
};

      这是一种重载运算符的方式,我开始用的是函数。但是在快速幂的时候确实有些慢(如果直接传参的话)。感谢lijinnn(吉林队长)。

      其中,矩阵从零开始的空间优化特别多!此题没有...因为都没怎么开矩阵

    最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#define mod 10000
using namespace std;
struct Matr
{
int a[3][3];
Matr(){memset(a,0,sizeof a);}
Matr operator *(const Matr &z)//重定义运算符
{
Matr re;
int p=2;
for(int i=0;i<p;++i)
{
for(int j=0;j<p;++j)
{
for(int k=0;k<p;++k)
{
re.a[i][j]=(re.a[i][j]+a[i][k]*z.a[k][j])%mod;
}
}
}
return re;
}
};
Matr quick_power(int x)//快速幂
{
Matr ori;
for(int i=0;i<=1;i++)
{
for(int j=0;j<=1;j++)
{
ori.a[i][i]=1;
}
}
Matr k;
k.a[0][1]=k.a[1][0]=k.a[1][1]=1;
while(x)
{
if(x&1) ori=ori*k;
k=k*k;
x>>=1;
}
return ori;
}
int main()
{
int n;
while(1)
{
scanf("%d",&n);
if(n==-1) return 0;
Matr s;
s=quick_power(n);
Matr ans;
ans.a[0][0]=-1;
ans=ans*s;
printf("%d\n",-ans.a[0][1]);//为了方便,我的初始矩阵用的是负数为的是如果求第i项,快速幂i次即可
//但是由于开始是负数,所以需要在最后乘上-1
}
}

    小结:矩阵好东西,推荐自己的blog 矩阵算法学习摘记

[poj3070]Fibonacci_矩乘_快速幂的更多相关文章

  1. BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS

    BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS 题意: 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p, ...

  2. Luogu P1226 取余运算||快速幂_快速幂

    超短代码 #include<iostream> #include<cstdio> using namespace std; long long b,p,k; long long ...

  3. codeforces_300C_组合数_快速幂

    C. Beautiful Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  4. [bzoj2467][中山市选2010]生成树_快速幂

    生成树 bzoj-2467 中山市选2010 题目大意:题目链接 注释:略. 想法:首先,考虑生成树的性质.每两个点之间有且只有一条路径.我们将每个五边形的5条边分为外面的4条边和内部的一条边,在此简 ...

  5. [SDOI2008]沙拉公主的困惑 线性筛_欧拉函数_逆元_快速幂

    Code: #include<cstdio> using namespace std; typedef long long ll; const int maxn=10000000+1; l ...

  6. [国家集训队]拉拉队排练 Manancher_前缀和_快速幂

    Code: #include <cstdio> #include <algorithm> #include <cstring> using namespace st ...

  7. 矩阵快速幂——POJ3070

    矩阵快速幂和普通的快速幂差不多,只不过写起来比较麻烦一点,需要重载*运算符. 模板: struct mat { int m[maxn][maxn]; }unit; mat operator * (ma ...

  8. nyoj1000_快速幂_费马小定理

    又见斐波那契数列 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 斐波那契数列大家应该很熟悉了吧.下面给大家引入一种新的斐波那契数列:M斐波那契数列. M斐波那契数列 ...

  9. nyoj_148_fibonacci数列(二)_矩阵快速幂

    fibonacci数列(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 In the Fibonacci integer sequence, F0 = 0, F ...

随机推荐

  1. JAVA基础(多线程Thread和Runnable的使用区别(转载)

    转自:http://jinguo.iteye.com/blog/286772 Runnable是Thread的接口,在大多数情况下“推荐用接口的方式”生成线程,因为接口可以实现多继承,况且Runnab ...

  2. Gym - 101982A 2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) A. Exam

    题面 题意:你和朋友一起做了n道判断题,现在你知道你们两的答案,也知道你朋友对了k个,问你至少对了几个 题解:假设你和朋友n个答案都一样,那你是不是也对了k个,假设你和朋友有1个答案不一样,是不是,你 ...

  3. Akka源码分析-ask模式

    在我之前的博文中,已经介绍过要慎用Actor的ask.这里我们要分析一下ask的源码,看看它究竟是怎么实现的. 开发时,如果要使用ask方法,必须要引入akka.pattern._,这样才能使用ask ...

  4. Vue.js中学习使用Vuex详解

    在SPA单页面组件的开发中 Vue的vuex和React的Redux 都统称为同一状态管理,个人的理解是全局状态管理更合适:简单的理解就是你在state中定义了一个数据之后,你可以在所在项目中的任何一 ...

  5. asp.net core 2.0 Json结果的格式

    asp.net core 2.0 默认返回的结果格式是Json, 并使用json.net对结果默认做了camel case的转化(大概可理解为首字母小写). 这一点与老.net web api 不一样 ...

  6. Django总结四

    0.ORM操作 1.必会的13条 返回对象列表的 all filter exclude order_by reverse distinct 特殊的对象列表 values values_list 返回对 ...

  7. android ListView,GridView 设置某一项显示位置

    在项目中有时会用到,当使用 listview  想让它显示某一项,当它又不在前面的位置,可以 使用 //让某一项显示出来(否则可能不在当前) listview.setSelection(positio ...

  8. vs项目结构解析

    当我们用VS开发一个项目的时候,首先应该清楚用VS这个IDE生成的一些文件和文件夹是什么意思,起什么作用,什么场合下使用. 因为我使用的是VS2015,就以这个为例来进行一些说明: 首先要做的是更改你 ...

  9. UDP网络程序实例

    根据前面所讲的网络编程的基础知识,以及UDP网络编程的特点,下面创建一个广播数据报程序.广播数据报是一种较新的技术,类似于电台广播,广播电台需要在指定的波段和频率上广播信息,收听者也要将收音机调到指定 ...

  10. js indexOf 列表筛选

    先来一堆效果图:  代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...