HDU 1005 Number Sequence(矩阵快速幂,快速幂模板)

原创 2018年04月16日 20:35:54
Problem 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
 

以下是快速幂的模板, 求a^n, 为防止溢出,中间最好mod一哈

int main(){
	int n;
	int a;
	cin >> a>>n;
	int ans = 1;
	while(n){//a^n
		if(n&1){
			ans *= a; 
		}
		a*=a;
		n>>=1;
		ans %= 10000007;
	}
	cout << ans<<endl;
    return 0;
}

本题的递推式:

代码(含矩阵快速幂):


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<queue>
#include<cmath>
#include<stdlib.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int maxn = 1e5 + 100;
double eps = 1e-8;
int a[4][4], b[4][4];
int ans[4][4];

struct mtx{
	int a[4][4];
};
mtx mtpl(mtx x, mtx y){//将矩阵a乘b的结果直接放在tmp里 
    mtx tmp;
    memset(tmp.a, 0, sizeof(tmp.a));
	for(int i = 1; i <= 2; i++){
		for(int j = 1; j <= 2; j++){
			int sum = 0;
			for(int k = 1; k <= 2; k++){
				sum += x.a[i][k] * y.a[k][j];
			} 
			sum%=7;
			tmp.a[i][j] += sum;
		}
	}
	return tmp;
}
int main(){
	int A, B;
	ll n;
	while(scanf("%d %d %lld", &A, &B, &n) ){
		if(A==B && B==n && n==0)break;
		mtx a, ans;
		ans.a[1][1] = ans.a[2][2] = 1;
		ans.a[1][2] = ans.a[2][1] = 0;
		a.a[1][1] = A;
		a.a[1][2] = B;
		a.a[2][1] = 1;
		a.a[2][2] = 0;
		n-=2;  //注意这里求的是a^(n-2)而不是a^n 
		if(n==-1) {
			cout << 1<<endl;
			continue;
		}
		while(n){
			if(n&1)ans=mtpl(ans, a);
			a=mtpl(a, a);
			n>>=1;
		}
		cout << (ans.a[1][1]+ans.a[1][2]) %7<< endl;//人家说最后结果mod 7,WA的时候没想到这里要%7。。不是第一次了
	} 
    return 0;
}

实战COM(07)----COM+的特性之建立者字符串

本文欢迎转载,唯请注明出处及作者 blackcolor@263.net---------------------------------------------------              ...
  • blackcolor
  • blackcolor
  • 2001-08-03 10:12:00
  • 786

poj 3070 Fibonacci(矩阵快速幂模板,斐波那契)

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12812   Acc...
  • acm_cxq
  • acm_cxq
  • 2016-07-18 17:35:18
  • 504

杭电ACM 1005:Number Sequence

原创作品 转载请注明出处http://blog.csdn.net/always2015/article/details/45741011刚开始这题看起来比较容易,因为直接用递归的话很容易搞定。但是提交...
  • Always2015
  • Always2015
  • 2015-05-15 10:08:03
  • 1513

【HDU1005】Number Sequence(矩阵快速幂)

题目链接 题目大意: f[1] = 1,f[2] = 1,f[n] = (a*f[n-1]+b*f[n-2])%7(n > 2) 给你a,b。求f[n]。网上好像都是找规律的。 我想用下矩阵...
  • oranges_c
  • oranges_c
  • 2017-02-15 22:13:03
  • 386

HDU 1005 Number Sequence python实现

# -*- coding:utf-8 -*- import sys import re def main(): t =True; while t: ss = raw_input(&q...
  • lunzi3775
  • lunzi3775
  • 2018-02-20 19:18:53
  • 20

hdu6030 (矩阵快速幂)

这道题让我深深感到了线性代数的重要性啊,递推关系式不是随便搞搞就能出来的! 如果用a表示红色,用b表示蓝色。题意明显可以看出只需要管长度2和3的连续序列是否符合! 如果以b结尾,那么下一个必须是a,或...
  • nucshiyilang
  • nucshiyilang
  • 2017-05-08 11:59:11
  • 440

【杭电oj】1005 - Number Sequence(找规律)

点击打开题目 Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav...
  • wyg1997
  • wyg1997
  • 2016-07-18 19:58:50
  • 677

HDU 1005 Number Sequence(循环周期是关键)

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)...
  • hurmishine
  • hurmishine
  • 2016-05-06 17:06:02
  • 1813

hdu 1005Number Sequence 看高手如何找规律

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)...
  • hnust_xiehonghao
  • hnust_xiehonghao
  • 2012-09-01 22:26:51
  • 7694

hdu-4549 M斐波那契数列【矩阵快速幂】

找规律写出f(2),f(3),f(4),f(5) .........可以发先 a b的系数是一系列的fib数列   如果可以求出fib数列 求快速幂就可以了    这样问题就在于如何求fib数列了 ...
  • a915800048
  • a915800048
  • 2016-04-19 12:01:27
  • 266
收藏助手
不良信息举报
您举报文章:HDU 1005 Number Sequence(矩阵快速幂,快速幂模板)
举报原因:
原因补充:

(最多只允许输入30个字)