HDU 1005

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

法一:想到的为矩阵快速幂求斐波那契数列

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
struct node{
	int mat[2][2];
};
struct node Cal(struct node a,struct node b){
	struct node te;
	memset(te.mat,0,sizeof(te.mat));
	for(int i=0;i<2;i++){
		for(int j=0;j<2;j++){
			if(a.mat[i][j]){
				for(int t=0;t<2;t++){
					te.mat[i][t]=(te.mat[i][t]+a.mat[i][j]*b.mat[j][t])%7;
				}
			}
		}
	}
	return te;
}
struct node Quick(struct node a,int n){
	if(n==1){
		return a;
	}
	struct node e;
	memset(e.mat,0,sizeof(e.mat));
	for(int i=0;i<2;i++){
		e.mat[i][i]=1;
	}
	if(n==0){
		return e;
	}
	while(n){
		if(n&1){
			e=Cal(a,e);
		}
		a=Cal(a,a);
		n=n>>1;
	}
	return e;
}
int main(){
	int a,b,n;
	struct node re;
	while(scanf("%d%d%d",&a,&b,&n)!=EOF){
		if(!a&&!b&&!n){
			break;
		}
		re.mat[0][0]=0;
		re.mat[0][1]=1;
		re.mat[1][0]=b;
		re.mat[1][1]=a;
		re=Quick(re,n-1);
		cout<<(re.mat[0][0]+re.mat[0][1])%7<<endl;
	}
	return 0;
}

//法二:思维,试着去找循环节

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int main(){
	int i,a,b,n,cot;
	int f[10000];
	while(scanf("%d%d%d",&a,&b,&n)!=EOF&&a&&b&&n){
		f[1]=f[2]=1;
		for(i=3;i<10000;i++){
			f[i]=(a*f[i-1]+b*f[i-2])%7;
			if(f[i]==1&&f[i-1]==1){
				break;
			}
		}
		cot=i-2;
		f[0]=f[cot];
		cout<<f[n%cot]%7<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值