A - Number Sequence(矩阵快速幂或者找周期)
Description
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
Given A, B, and n, you are to calculate the value of f(n).
Input
integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n
<= 100,000,000). Three zeros signal the end of input and this test
case is not to be processed.
Output
Sample Input
1 2 10
0 0 0
Sample Output
问题:arr[1] = 1; arr[2] = 1; arr[i] = A*arr[i-2]+B*arr[i-1];
测试案例有若干项,每个案例给出A, B, n,输出arr[n]的值
输入以0,0,0结束
分析:这种有规律的序列都是有周期的,
每输入一组数据,计算出一个周期内的所有的数,和周期大小
输入n之后就可以找出第n项了
因为每一项只能是 1~7 之间的数字,而后一项又与前两项有关,所以周期为A(7, 2)
分析到这里我们就可以介绍下面两种方法了
Ⅰ方法一,矩阵快速幂算类似于斐波那契数列
对于这样的数列:
f(1) = a, f(2) = b, f(n) = A * f(n - 2) + B * f(n - 1). 可以用以下方法求f(n)
我们注意到从第三项开始
aaarticlea/png;base64,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" alt="" />(可以在演草纸上算出)
从第三项开始,我们可以先算出aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAA3CAIAAAB1mnhaAAACDklEQVR4nO2b0ZWEIAxFacsmLIN27IZmLMb5kPFISDi8WcMwZ9/9Wl13Ei4QGXTDQboJ307gl6AsAMoCoCwAygKgLADKAqAsAMoCgGTt2xJUYvLK706KIYRl20fEUkFH1unrnnGKY3y9e2pMx6h8JEv07qnLtxH7toQY4wBZYtIUv6qvzkMlo4kR+Q6YHimGZdvLQKIoPCJRCJKHamJm27/jKsUzqBHptDadrGoS5t51nRr7tuSYWg04NFlnI9d1tSZUJ3+RpdwNx9T1HMUYQupp4ej6WTbAVtlfs1RZ1ST0L+3vGXgcByxrXdf7ITS41OsRWead0K1gpVh8eL1uuZ1+UJY51vQMtfarOXmOLWMN7CyrcSUgSztv9PUT9I/jB2XJii4O6z9o3aDV5aiLKzED7/HkOLbuhmpRb0dt1/5uWXVGefHqpsrKoTr/4DqrTZ+sclFvV49HuAerqrsWeTJZc0NZAJQFQFkAlAVAWQCUBUBZAJQFQFkAlAVAWQDzyyr2e70ovjyb0aaWdTXBN78ij9aO7Kyyyp1ez/yqvUZb15yyUswp+T8uVPZlTVtzyrpwl6Xt7Zv7/f9dljqKrKFFWZTVDWUB2LJYs4wAv1Lg9YdOZXqe+SlDS3aix8tsbT57W3nAa1mVrQm+sk4rS8Qw3mMbCyZr6JNpEe/bpg7+0wAEZQFQFgBlAVAWwAtNFGoVB7HtXgAAAABJRU5ErkJggg==" alt="" />,然后用结果矩阵的上边的元素作为计算的f(n)
比如aaarticlea/png;base64,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" alt="" /> 那么f(n) = a[0][0]*b + a[0][1]*a; Ⅱ 方法二:
我们已经分析了这个数列是又周期的,周期为42,因为f(1) = 1, f(2) = 1
所以,当再次遇到1, 1的时候,就已经找到所有的答案了
用一个数组存储这个数列一个周期里的结果,输出即可 方法分析:如果我们没有算出这个数列的周期,而且我们不确定这个周期到底多大,那么可以采用第一种方法,
因为这种情况如果采用第二种方法就可能出现开的存储一个周期内数据的数组太小的情况,
现在我们既然知道周期了,当然是第二种方法比较简单
但是我真心不知道为什么我用第二种方法的时候竟然和我开的数组大小有关,M = 50对,M = 10000对,还有一些数据对,但是M为其他数就不对了
我就郁闷了,和我开的数组大小有毛线关系 代码1:
#include <cstdio>
#include <cstring>
#define N 2
struct Mat
{
int arr[N][N];
}; //定义矩阵 Mat multiply(Mat x, Mat y)//矩阵乘法
{
Mat res;
memset(res.arr, , sizeof(res.arr));
for(int i = ; i < N; i++)
{
for(int j = ; j < N; j++)
{
for(int k = ; k < N; k++)
{
res.arr[i][j] += x.arr[i][k] * y.arr[k][j];
//res.arr[i][j] %= 7;
}
}
}
return res;
} Mat cacl(Mat a, int n) //矩阵快速幂,算a的n次方
{
Mat res;
for(int i = ; i < N; i++)
{
for(int j = ; j < N; j++)
res.arr[i][j] = (i == j);
}
while(n)
{
if(n & )
res = multiply(res, a);
n /= ;
a = multiply(a, a);
}
return res;
} int main()
{
int A, B, n;
Mat a;
while(scanf("%d%d%d", &A, &B, &n), (A || B || n))
{
a.arr[][] = A;
a.arr[][] = B;
a.arr[][] = ;
a.arr[][] = ;
n %= ;
if(n == || n == )
printf("1\n");
else
{
Mat tmp = cacl(a, n-);
int ans = (tmp.arr[][] + tmp.arr[][]) % ;
printf("%d\n", ans);
}
}
return ;
}
方法二代码:
#include <stdio.h>
#define M 10000
int cacl(int arr[], int A, int B)
{
int i;
arr[] = arr[] = ;
for(i = ; i<= M-; i++)
{
arr[i] = (A*arr[i-] + B*arr[i-]) % ;
//printf("arr[%d] = %d\n", i, arr[i]);
if(arr[i] == && arr[i-] == )
break;
}
arr[] = arr[i-];
return (i-);
}
int main()
{
int arr[M];
int A, B, n;
int T;
while(scanf("%d%d%d", &A, &B, &n), (A||B||n))
{
T = cacl(arr, A, B);
//printf("T = %d\n", T);
n %= T;
printf("%d\n", arr[n]);
}
return ;
}
A - Number Sequence(矩阵快速幂或者找周期)的更多相关文章
- HDU - 1005 Number Sequence 矩阵快速幂
HDU - 1005 Number Sequence Problem Description A number sequence is defined as follows:f(1) = 1, f(2 ...
- UVA - 10689 Yet another Number Sequence 矩阵快速幂
Yet another Number Sequence Let’s define another number sequence, given by the foll ...
- Yet Another Number Sequence——[矩阵快速幂]
Description Everyone knows what the Fibonacci sequence is. This sequence can be defined by the recur ...
- HDU 1005 Number Sequence(矩阵快速幂,快速幂模板)
Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1 ...
- HDU - 1005 -Number Sequence(矩阵快速幂系数变式)
A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) m ...
- Yet another Number Sequence 矩阵快速幂
Let’s define another number sequence, given by the following function: f(0) = a f(1) = b f(n) = f(n ...
- SDUT1607:Number Sequence(矩阵快速幂)
题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1607 题目描述 A number seq ...
- Codeforces 392C Yet Another Number Sequence (矩阵快速幂+二项式展开)
题意:已知斐波那契数列fib(i) , 给你n 和 k , 求∑fib(i)*ik (1<=i<=n) 思路:不得不说,这道题很有意思,首先我们根据以往得出的一个经验,当我们遇到 X^k ...
- CodeForces 392C Yet Another Number Sequence 矩阵快速幂
题意: \(F_n\)为斐波那契数列,\(F_1=1,F_2=2\). 给定一个\(k\),定义数列\(A_i=F_i \cdot i^k\). 求\(A_1+A_2+ \cdots + A_n\). ...
随机推荐
- C++类包含问题(重复包含和相互包含)
一.重复包含头文件 头文件重复包含,可能会导致的错误包括:变量重定义,类型重定义及其他一些莫名其妙的错误.C++提供两种解决方案,分别是#ifndef和#pragma once #ifndef _SO ...
- Android应用开发基础篇(10)-----Menu(菜单)
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/28/2372101.html 一.概述 Menu,简单来理解就是当你按下手机的“menu”键时所 ...
- c++ primer plus 习题答案(7)
p427.4 //头文件: #include<iostream> #ifndef STACK_H_ #define STACK_H_ typedef unsigned long Item; ...
- JavaSE_ 面向对象 总目录(7~10)
JavaSE学习总结第07天_面向对象2 07.01 成员变量和局部变量的区别07.02 方法的形式参数是类名的调用07.03 匿名对象的概述和应用07.04 封装的概述07.05 封装的好处和设计原 ...
- python质量控制
一种编写高质量软件的方式是给代码中每个函数写测试,在开发过程中经常性的进行测试. doctest模块可以在docstring中嵌套测试代码.例如: def average(values ...
- 电脑bios到底是什么?
没有哪个玩电脑的人不知道电脑bios,但是真正能明白bios是什么的?身边却没几个,甚至大多数电脑维修站的人员对bios也不够详细了解.一般人不去关心bios是因为它离我们的电脑真正使用仍有一段距离. ...
- AnyEvent::HTTP 实现异步请求
异步http: jrhmpt01:/root/async# cat a1.pl use LWP::UserAgent; use utf8; use DBI; use POSIX; use HTTP:: ...
- 字符串模式匹配KMP算法
一篇不错的博客:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html KMP字符串模式匹配通俗点说就是一种在一个字符串中 ...
- 关于js的一些总结
1.js中如果判断变量是否为空,要注意两种情况: 一种是变量为空:另一种是变量为0: 2.js如果要进行算术运算或者比较,最好把它强制类型为整型或者浮点型.防止字符串比较,如果本来是数字的字符串,如果 ...
- Eclipse安装反编译插件JD(Java Decompiler)
JD安装说明:*****Eclipse 插件安装*****1. 在网上搜索并下载jdeclipse_update_site.zip2. Eclipse -> Install New Softwa ...