题目描述:

请输出(3+√5)^n整数部分最后3位。如果结果不超过2位,请补足前导0.

分析:

我们最容易想到的方法肯定是直接计算这个表达式的值,但是这样的精度是不够的。朴素的算法没有办法得到答案。但是我们根据分析可以发现这个问题不用求出√5的值也可以得到答案。

我们可以发现,将(3+√5)n这个式子展开后就是An+Bn√5的形式。同样的,我们将(3-√5)n这个式子展开后就是An-Bn√5。

因此,(3+√5)n+(3-√5)n=2An是一个整数,其中0<(3-√5)^n <1,是解题的关键。由于(3+√5)n=2An-(3-√5)n,所以(3+√5)^n的整数部分就是2An-1.

根据上面的推导,只要高效的求出An就可以解决这个问题了。由于(3+√5)(n+1)=(3+√5)(3+√5)n=(3+√5) (An+Bn√5),我们可以得到An,Bn,A(n+1),B(n+1)的递推关系。

A(n+1)=3An+5Bn;

B(n+1)=An+3Bn;

A0=1 B0=0;

我们可以用矩阵表示这个递推关系,因此可以使用快速幂运算。因为结果要求的是后三位,所以最后取余1000就行。

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
struct Node
{
int e[2][2];
Node()
{
memset(e,0,sizeof(e));
}
};
Node mul(Node a,Node b)
{
Node c; for(int i=0; i<2; i++)
for(int j=0; j<2; j++)
for(int k=0; k<2; k++)
{
c.e[i][j]+=(a.e[i][k]*b.e[k][j]);
}
return c;
} Node quick_mi(Node a,int b)
{
Node c;
c.e[0][0]=1;
c.e[1][1]=1;
while(b)
{
if(b&1)
c=mul(c,a);
b>>=1;
a=mul(a,a);
}
return c;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
Node A;
A.e[0][0]=3;
A.e[0][1]=5;
A.e[1][0]=1;
A.e[1][1]=3;
A=quick_mi(A,n);
printf("%03d\n",(2*A.e[0][0]-1)%1000);
}
return 0;
}

2008 Round 1A C Numbers (矩阵快速幂)的更多相关文章

  1. hdu 3117 Fibonacci Numbers 矩阵快速幂+公式

    斐波那契数列后四位可以用快速幂取模(模10000)算出.前四位要用公式推 HDU 3117 Fibonacci Numbers(矩阵快速幂+公式) f(n)=(((1+√5)/2)^n+((1-√5) ...

  2. Count Numbers(矩阵快速幂)

    Count Numbers 时间限制: 8 Sec  内存限制: 128 MB提交: 43  解决: 19[提交] [状态] [讨论版] [命题人:admin] 题目描述 Now Alice want ...

  3. Project Euler 435 Polynomials of Fibonacci numbers (矩阵快速幂)

    题目链接: https://projecteuler.net/problem=435 题意: The Fibonacci numbers $ {f_n, n ≥ 0}$ are defined rec ...

  4. Educational Codeforces Round 60 D dp + 矩阵快速幂

    https://codeforces.com/contest/1117/problem/D 题意 有n个特殊宝石(n<=1e18),每个特殊宝石可以分解成m个普通宝石(m<=100),问组 ...

  5. Educational Codeforces Round 14E. Xor-sequences(矩阵快速幂)

    传送门 题意 给定序列,从序列中选择k(1≤k≤1e18)个数(可以重复选择),使得得到的排列满足\(x_i与x_{i+1}\)异或的二进制表示中1的个数是3的倍数.问长度为k的满足条件的序列有多少种 ...

  6. 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。

    /** 题目:Lost in WHU 链接:https://oj.ejq.me/problem/26 题意:一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开. ...

  7. Google Code Jam 2008 Round 1A C Numbers(矩阵快速幂+化简方程,好题)

    Problem C. Numbers This contest is open for practice. You can try every problem as many times as you ...

  8. Sam's Numbers 矩阵快速幂优化dp

    https://www.hackerrank.com/contests/hourrank-21/challenges/sams-numbers 设dp[s][i]表示产生的总和是s的时候,结尾符是i的 ...

  9. hdu 5667 BestCoder Round #80 矩阵快速幂

    Sequence  Accepts: 59  Submissions: 650  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 65536 ...

随机推荐

  1. IT行业大学生就业分析报告感想

    现如今的高校毕业生每年都在增长,就业压力只增不减,人才市场挤满了人 学生们普遍的表现出就业难的情况,并且适合自己的工作也难找 从报告中也容易看出IT行业很吸引人,也是人数最多的,因此机会也就变少了 在 ...

  2. win8平板APP开发的教程文章

    http://blog.csdn.net/tcjiaan/article/details/7866595 基于C#的Metro工程如何引用C++的动态库——FIleNotFound解决办法: http ...

  3. Git(未完待续)

    Git的历史咱们就不多说来,我还是喜欢直白点,直接来干货吧 在Linux上安装Git 不同的系统不同的安装命令,基础的就不说来,centos直接yum就ok. 安装完成后,还需要最后一步设置,在命令行 ...

  4. 【移动端debug-2】Flexbox在移动端的兼容实践

    最近在项目中用到了flexbox,总结一下使用心得. 一.什么是flexbox,干嘛使的? 曾几何时,我们特别希望能像word一样,在排版时有个分散对齐选项(平均分配子元素宽度)这样我就可以任意在父元 ...

  5. 【数据库】mysql中复制表结构的方法小结

    mysql中用命令行复制表结构的方法主要有一下几种: 1.只复制表结构到新表 ? 1 CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2 或者 ? 1 CREATE ...

  6. jquery.fullpage 全屏滚动

    参考文档 :http://www.dowebok.com/77.html 下载地址: https://github.com/alvarotrigo/fullPage.js 1. 使用 HTML < ...

  7. 51nod 1682 中位数计数(差分统计)

    中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在多少个包含其的区间中是中位数. 首先,显 ...

  8. BZOJ 1228 E&G(sg函数+找规律)

    把一对石子堆看出一个子游戏.打出子游戏的sg表找规律.. 这个规律我是一定找不出来的... 对于i,j,如果 (i-1)%pow(2,k+1) < pow(2,k) (j-1)%pow(2,k+ ...

  9. 【bzoj4182】Shopping 树的点分治+dfs序+背包dp

    题目描述 给出一棵 $n$ 个点的树,每个点有物品重量 $w$ .体积 $c$ 和数目 $d$ .要求选出一个连通子图,使得总体积不超过背包容量 $m$ ,且总重量最大.求这个最大总重量. 输入 输入 ...

  10. hive 连接(join)查询

    1.内连接 hive> select b.*,a.name from userinfo2 b,userinfo a where a.userid=b.userid; hive> selec ...