Description

A number sequence is defined as follows:

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

The input consists of multiple test cases. Each test case contains 3
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

For each test case, print the value of f(n) on a single line.
 

Sample Input

1 1 3
1 2 10
0 0 0
 

Sample Output

2 5
    问题: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(矩阵快速幂或者找周期)的更多相关文章

  1. HDU - 1005 Number Sequence 矩阵快速幂

    HDU - 1005 Number Sequence Problem Description A number sequence is defined as follows:f(1) = 1, f(2 ...

  2. UVA - 10689 Yet another Number Sequence 矩阵快速幂

                      Yet another Number Sequence Let’s define another number sequence, given by the foll ...

  3. Yet Another Number Sequence——[矩阵快速幂]

    Description Everyone knows what the Fibonacci sequence is. This sequence can be defined by the recur ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. SDUT1607:Number Sequence(矩阵快速幂)

    题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1607 题目描述 A number seq ...

  8. Codeforces 392C Yet Another Number Sequence (矩阵快速幂+二项式展开)

    题意:已知斐波那契数列fib(i) , 给你n 和 k , 求∑fib(i)*ik (1<=i<=n) 思路:不得不说,这道题很有意思,首先我们根据以往得出的一个经验,当我们遇到 X^k ...

  9. 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\). ...

随机推荐

  1. BZOJ 1770: [Usaco2009 Nov]lights 燈( 高斯消元 )

    高斯消元解xor方程组...暴搜自由元+最优性剪枝 -------------------------------------------------------------------------- ...

  2. BZOJ 2561: 最小生成树(最小割)

    U,V能在最小(大)生成树上,当且仅当权值比它小(大)的边无法连通U,V. 两次最小割就OK了. --------------------------------------------------- ...

  3. C/C++ 结构体成员在内存中的对齐规则

    这几天在看王艳平的<windows 程序设计>,第5章讲解了MFC框架是怎么管理窗口句柄到窗口实例之间的映射,用到了两个类CPlex和CMapPtrToPtr,用于管理内存分配的类(避免因 ...

  4. poj 3422 Kaka's Matrix Travels 费用流

    题目链接 给一个n*n的矩阵, 从左上角出发, 走到右下角, 然后在返回左上角,这样算两次. 一共重复k次, 每个格子有值, 问能够取得的最大值是多少, 一个格子的值只能取一次, 取完后变为0. 费用 ...

  5. 【转载】python 模块 - random生成随机数模块

    随机数种子 要每次产生随机数相同就要设置种子,相同种子数的Random对象,相同次数生成的随机数字是完全相同的: random.seed(1) 这样random.randint(0,6, (4,5)) ...

  6. ImageMagick还是GraphicsMagick?

    引自:http://co63oc.blog.51cto.com/904636/328997 ImageMagick(IM) 套装包含的命令行图形工具是一主要自由软件:Linux,其他类Unix操作系统 ...

  7. 在Spring Boot启动后执行指定代码

    在开发时有时候需要在整个应用开始运行时执行一些特定代码,比如初始化环境,准备测试数据等等. 在Spring中可以通过ApplicationListener来实现相关的功能,不过在配合Spring Bo ...

  8. AnyEvent::HTTP 实现异步请求

    异步http: jrhmpt01:/root/async# cat a1.pl use LWP::UserAgent; use utf8; use DBI; use POSIX; use HTTP:: ...

  9. VC获取精确时间的做法

    声明:本文章是我整合网上的资料而成的,其中的大部分文字不是我所为的,我所起的作用只是归纳整理并添加我的一些看法.非常感谢引用到的文字的作者的辛勤劳动,所参考的文献在文章最后我已一一列出. 对关注性能的 ...

  10. [Python]Unicode转ascii码的一个好方法

    写这篇文章的是一位外国人,他遇到了什么问题呢?比如有一个 Unicode 字符串他需要转为 ascii码: >>> title = u"Klüft skräms inför ...