杭电1005

Number Sequence

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005

题目要求

给一个数列满足 f ( n ) = ( a * f (n - 1 ) + b * f ( n - 2 ) ) mod 7 ,且f (1 ) = 1 , f ( 2 ) = 1, 给定a,b,n,输出f(n)。
在这里插入图片描述

分析

首先分析可知a和b都是已知量,故每一个f(n)都是由f( n-1 )和 f( n-2 )唯一确定的值,所以f ( 3 ) 是由 f (1)和f ( 2 )确定的,当某一次f( n-1 )==1 和 f( n-2 )==1均成立时,就成为了一个循环,时间复杂度大大降低。
第二个问题就是确定循环,因为是mod 7的公式,故f( n-1 ) 和f( n-2 )只能取 0,1,2,3,4,5,6七个值,一共就是49种情况。只需要最多列举49次即可得到结果。
不用担心重复的情况出现,举个栗子。

  1. 1 1
  2. 1 2
  3. 2 3
  4. 3 4
  5. 4 5
  6. 5 2
  7. 2 3

    如上假设,第七次出现了重复,而会再一次出现2一定是1 1 这一对数值决定的,不可能是4 5。

代码

#include<iostream>
using namespace std;
int main(){
	int a,b,n,z,i;
	int s[55];
	while(~scanf("%d%d%d",&a,&b,&n)&&(a||b||n)){
		s[1]=s[2]=1;
		for(i=3;i<50;i++){
			 s[i]=(s[i-1]*a+s[i-2]*b)%7;
			 
		     if(s[i]==1&&s[i-1]==1)
		     	break;

		}
		z=i-2;
		if(n%z==0)   
		   cout<<s[z]<<endl;
		else
		   cout<<s[n%z]<<endl; 
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值