题目信息:

1471: Jiulianhuan

时间限制: 1 Sec  内存限制: 128 MB
提交: 95  解决: 22

题目描述

  For each data set in the input print on a separate line, on the standa  I think that you might have played the traditional Chinese ring game: The Chinese Linking Rings (here we call its nickname Jiulianhuan —— “九连环”). Well, you
say you haven’t played it before? Then you must have seen it before, right? If not seen, come to borrow mine to have a good look at it and enjoy it!d output, the integer that represents the maximal amount of overtaking.

Now, I would like to mention the rules or common sense of Jiulianhuan again.
1) The first ring can put on or down the handles at any time. That is, when the first ring is under the handle, it can climb up the handle within one step, and vice versa.
2) At any moment, you can only operate one ring, on the condition that the ring is operable.
3) If the first k-2 rings are under the handle, and the (k-1)th ring is on the handle, then if the k-th ring is under the handle, you can put it on the handle, and if it is not under the handle, you can put it down the handle.
Seems complicated? But I tried my simplest explanation to you, and I hope its not hard for you to understand. Maybe you have played the game before,  and the above is what actually a “step” means in the game.

输入

  Given n (not bigger than 10^8), you are to output the minimum steps it needs to down n well-put rings. There are no more than 100 test cases.

输出

  A number a line. Because the number are so huge ,you are to output the result after it mod prime 10007.

样例输入

1
2
9
1005

样例输出

1
2
341
4260

提示

/*
由题意可推知:
a(1)=1;
a(2)=2;
a(3)=5;
a(4)=10;
a(n) = a(n-1)+2*a(n-2)+1;
求得通项公式:
    a(1) = 1;
    a(2) = 2;
    奇数:a(n) = a1+3/4*(2^(n-1)-1);
    偶数:a(n) = a2+3/8*(2^(n-2)-1);

*/
三种方法实现该题:
/*********************************************************************/
 //直接用通项公式求答案
#include "stdio.h"
#include "string.h"
#define MOD 10007
#define MOD_D 30021 int mypow(int a,int n) //快速幂
{
int y;
if(n==)
return ;
y = mypow(a,n/);
y = (y*y)%MOD_D;
if(n%==)
y *= a;
return y%MOD_D;
} int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==) { printf("1\n"); continue; }
if(n==) { printf("2\n"); continue; }
if(n%==)
printf("%d\n",(+(*((mypow(,n-)-)%MOD_D)/)%MOD)%MOD);
else
printf("%d\n",(+(*((mypow(,n-)-)%MOD_D)/)%MOD)%MOD);
}
return ;
} /***********************************************************************/
//找循环节
#include "stdio.h"
#include "string.h" #define N 1000007
#define MOD 10007
int p[N] = {,,,}; int main()
{
int n;
for(n=; n<=N; ++n)
{
p[n] = (p[n-] + *p[n-] + )%MOD;
if(p[n]==p[] && p[n-]==p[])
break;
}
int k = n-;
while(scanf("%d",&n)!=EOF)
{
n = (n-)%k+;
printf("%d\n",p[n]);
}
return ;
} /******************************************************************/
//矩阵快速幂算法
#include "stdio.h"
#include "string.h"
#define MOD 10007 struct Matrix
{
int n,m;
int a[][];
}p0; Matrix Mult_mod(Matrix a,Matrix b)
{
Matrix c;
c.n = a.n;
c.m = b.m;
int i,j,k;
for(i=; i<a.n; ++i)
{
for(j=; j<a.m; ++j)
{
c.a[i][j] = ;
for(k=; k<a.m; ++k)
c.a[i][j] += (a.a[i][k]*b.a[k][j])%MOD;
}
}
return c;
} Matrix power_mod(Matrix a,int n)
{
if(n==)
return p0;
Matrix y = power_mod(a,n/);
y = Mult_mod(y,y);
if(n%==)
y = Mult_mod(y,p0);
return y;
} int main()
{
int n;
memset(p0.a,,sizeof(p0.a));
p0.n = ;
p0.m = ;
p0.a[][] = ;
p0.a[][] = ;
p0.a[][] = ;
p0.a[][] = ;
p0.a[][] = ;
Matrix ans;
while(scanf("%d",&n)!=EOF)
{
if(n==) printf("1\n");
else if(n==) printf("2\n");
else
{
ans = power_mod(p0,n-);
printf("%d\n",(*ans.a[][]+ans.a[][]+ans.a[][])%MOD);
} }
return ;
}

jiulianhuan 快速幂--矩阵快速幂的更多相关文章

  1. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

  2. 快速幂 & 矩阵快速幂

    目录 快速幂 实数快速幂 矩阵快速幂 快速幂 实数快速幂 普通求幂的方法为 O(n) .在一些要求比较严格的题目上很有可能会超时.所以下面来介绍一下快速幂. 快速幂的思想其实是将数分解,即a^b可以分 ...

  3. 【数论】 快速幂&&矩阵快速幂

    首先复习快速幂 #include<bits/stdc++.h> using namespace std; long long power(long long a,long long b,l ...

  4. 整数快速乘法/快速幂+矩阵快速幂+Strassen算法

    快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c  二.矩 ...

  5. 快速幂&&矩阵快速幂

    快速幂 题目链接:https://www.luogu.org/problemnew/show/P1226 快速幂用了二分的思想,即将\(a^{b}\)的指数b不断分解成二进制的形式,然后相乘累加起来, ...

  6. [板子]快速幂&矩阵快速幂

    不会的来这看:https://www.cnblogs.com/CXCXCXC/p/4641812.html 简单的一说:当转换为二进制的时候有位运算这种黑科技,&相当于%2判断奇偶性. x&a ...

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

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速 ...

  8. 矩阵快速幂模板(pascal)

    洛谷P3390 题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格 ...

  9. 培训补坑(day10:双指针扫描+矩阵快速幂)

    这是一个神奇的课题,其实我觉得用一个词来形容这个算法挺合适的:暴力. 是啊,就是循环+暴力.没什么难的... 先来看一道裸题. 那么对于这道题,显然我们的暴力算法就是枚举区间的左右端点,然后通过前缀和 ...

随机推荐

  1. C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe

    不得不说,.NET中安装服务很麻烦,即要创建Service,又要创建ServiceInstall,最后还要弄一堆命令来安装和卸载. 今天给大家提供一种方式,直接使用我们的程序来安装/卸载服务,并且可以 ...

  2. PHP验证邮箱地址代码

    PHP验证邮箱代码: function isEmail($email) { return strlen($email) > 6 && preg_match("/^[\w ...

  3. Python入门笔记(10):字典

    一.映射类型 我理解中的映射类型是:键值对的关系,键(key)映射值(value),且它们是一对多的关系.字典是Python唯一的映射类型. 扩展1:哈希表一种数据结构,值是根据相关的键进行数据存储的 ...

  4. Redis持久化-数据丢失及解决

    Redis的数据回写机制 Redis的数据回写机制分同步和异步两种, 同步回写即SAVE命令,主进程直接向磁盘回写数据.在数据大的情况下会导致系统假死很长时间,所以一般不是推荐的. 异步回写即BGSA ...

  5. jQuery: jquery.json.js

    http://api.jquery.com/jQuery.parseJSON/ http://www.json.org/json-zh.html http://fineui.codeplex.com/ ...

  6. IIS理解

    WEB开发基础 1IIS原理 IIS的本质其实就是一个sorket的服务器,浏览器就是一个sorket的客户端,浏览器发送请求信息给IIS,IIS返回信息给浏览器显示,就这么简单. 1http.sys ...

  7. HDU 1069---背包---Monkey and Banana

    HDU 1069 Description A group of researchers are designing an experiment to test the IQ of a monkey. ...

  8. ANSI X9.19 MAC算法

    /// <summary> /// 获取MAC校验字节数据 /// </summary> /// <param name="bankData"> ...

  9. IIS在默认情况并不支持对PUT和DELETE请求的支持

    IIS在默认情况并不支持对PUT和DELETE请求的支持: IIS拒绝PUT和DELETE请求是由默认注册的一个名为:“WebDAVModule”的自定义HttpModule导致的.WebDAV的全称 ...

  10. HTML Jquery

    在<网页制作Dreamweaver(悬浮动态分层导航)>中,运用到了jQuery的技术,轻松实现了菜单的下拉.显示.隐藏的效果,不必再用样式表一点点地修改,省去了很多麻烦,那么jQuery ...