jiulianhuan 快速幂--矩阵快速幂
题目信息:
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.
.jpg)
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(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 快速幂--矩阵快速幂的更多相关文章
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- 快速幂 & 矩阵快速幂
目录 快速幂 实数快速幂 矩阵快速幂 快速幂 实数快速幂 普通求幂的方法为 O(n) .在一些要求比较严格的题目上很有可能会超时.所以下面来介绍一下快速幂. 快速幂的思想其实是将数分解,即a^b可以分 ...
- 【数论】 快速幂&&矩阵快速幂
首先复习快速幂 #include<bits/stdc++.h> using namespace std; long long power(long long a,long long b,l ...
- 整数快速乘法/快速幂+矩阵快速幂+Strassen算法
快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c 二.矩 ...
- 快速幂&&矩阵快速幂
快速幂 题目链接:https://www.luogu.org/problemnew/show/P1226 快速幂用了二分的思想,即将\(a^{b}\)的指数b不断分解成二进制的形式,然后相乘累加起来, ...
- [板子]快速幂&矩阵快速幂
不会的来这看:https://www.cnblogs.com/CXCXCXC/p/4641812.html 简单的一说:当转换为二进制的时候有位运算这种黑科技,&相当于%2判断奇偶性. x&a ...
- hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速 ...
- 矩阵快速幂模板(pascal)
洛谷P3390 题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格 ...
- 培训补坑(day10:双指针扫描+矩阵快速幂)
这是一个神奇的课题,其实我觉得用一个词来形容这个算法挺合适的:暴力. 是啊,就是循环+暴力.没什么难的... 先来看一道裸题. 那么对于这道题,显然我们的暴力算法就是枚举区间的左右端点,然后通过前缀和 ...
随机推荐
- 使用saripaar对android输入控件进行快速验证
saripaar是个android的第三方快速校验,使用注解快速添加验证规则. public class LoginActivity extends Activity implements Valid ...
- jQuery中的动画与特效
1.显示和隐藏hide()和show() 对于动画来说,显示和隐藏是最基本的效果之一,简单介绍jQuery的显示和隐藏. <script type="text/javascript&q ...
- string.join加引号
columnsGen = string.Join(",", modelDictionary.Keys); valueGen = modelDictionary.Values.Agg ...
- MyBatis插入语句返回主键值
插入语句xml代码: <insert id="insertUser" parameterType="com.spring.mybatis.po.User" ...
- 内存分段 && 缓冲区 && 析构函数
一.内存中的程序: 在进程被载入内存中时,基本上被分成许多小的节,以下是6个主要的节. 低地址 高地 ...
- 关于html标签和属性的基本理解
一.关于标签和属性的基本理解: html页面的内容主要由"元素"或"标签"组成.使用标签来描述网页的内容. 标签tag一般都是成对出现,开始标签和结束标签,或者 ...
- ahjesus linux连接阿里云ubuntu服务器并更改默认账号和密码,以及创建子账户
先确保本地Linux服务器SSH服务开启,如果没有开启直接执行指令:service sshd start 然后我们使用ssh指令进行远程登陆 ssh username@ip-address 输入pas ...
- Angular 核心概念
module(模块) 作用 通过模块对页面进行业务上的划分,根据不同的功能划分不同的模块. 将重复使用的指令或者过滤器之类的代码做成模块,方便复用 注意必须指定第二个参数,否则变成找到已经定义的模块 ...
- Oracle之自动收集统计信息
一.Oracle 11g 在Oracle的11g版本中提供了统计数据自动收集的功能.在部署安装11g Oracle软件过程中,其中有一个步骤便是提示是否启动这个功能(默认是启用这个功能). 在这里介绍 ...
- Configure SSL for SharePoint 2013
http://blogs.msdn.com/b/fabdulwahab/archive/2013/01/21/configure-ssl-for-sharepoint-2013.aspx In thi ...