zoukankan      html  css  js  c++  java
  • hdu 1005

    题目大意:中文题,可以直接在OJ上看


    解题思路:本题如果直接递归的话很有可能会OVER STACK。

    1)本题的关键是找到循环节,即(arr[i] == 1 && arr[i - 1] == 1)

    2)

    又是一道给出了运算公式的数学凡是没有优化的话,超时超内存等等是避免不了的了。这题很显然是一个找规律的题目,也就是该题的求解中是存在循环节的。对于公式 f[n] = A * f[n-1] + B * f[n-2]; 后者只有7 * 7 = 49 种可能,为什么这么说,因为对于f[n-1] 或者 f[n-2] 的取值只有 0,1,2,3,4,5,6 7个数,AB又是固定的,所以就只有49种可能值了。由该关系式得知每一项只与前两项发生关系,所以当连续的两项在前面出现过循环节出现了,注意循环节并不一定会是开始的 1。 又因为一组测试数据中f[n]只有49中可能的答案,最坏的情况是所有的情况都遇到了,那么那也会在50次运算中产生循环节。找到循环节后,就可以轻松解决了。


    代码如下:

     

    //Problem:hdu1005
    
    #include <iostream>
    using namespace std;
    
    int arr[10000]; 
     
    int main()
    {
    	int A,B,n;
    	//freopen("E:\in.txt","r",stdin);
    	arr[1] = arr[2] = 1;
    	while(cin>>A>>B>>n, A || B || n)
    	{
    		int i;
    		for(i=3; i<10000 ;i++)
    		{
    			arr[i] = (A*arr[i-1] + B*arr[i-2]) % 7;
    			
    			//如果有两个连着 =1,则后面的全部和前面相同,即出现了周期
    			//这时就没必要再进行下去了,跳出循环, i-2为周期 
    			if(arr[i] == 1 && arr[i-1] == 1)			
    				break;
    		}
    		n = n % (i-2);
    		
    		// 把n对周期求模,当n = i-2时, n=0,此时本来应该取arr[i-2]的,所以把arr[0]=arr[i-2] 
    		//也可以这样:
    		//if(n==0)	 n=i-2; 
    		           
    		arr[0] = arr[i-2];
    		
    		cout << arr[n] << endl;
    	}
    	return 0;
    }
    


    2)也可以如下:

    /*
     * 1005_1.cpp
     *
     *  Created on: 2013年8月10日
     *      Author: Administrator
     */
    
    
    #include <iostream>
    int A,B;
    int f(int n){
    	if( n == 1 || n == 2){
    		return 1;
    	}
    	return (A*f(n-1)+B*f(n-2))%7;
    }
    int main(){
    
    	int n;
    	while(scanf("%d%d%d",&A,&B,&n)!=EOF,A||B||n){
    		int a = f(n%49);
    		printf("%d
    ",a);
    	}
    }
    


  • 相关阅读:
    第一次系统实践作业
    第03组 Beta版本演示
    第03组 Beta冲刺(4/4)
    第03组 Beta冲刺(3/4)
    第03组 Beta冲刺(2/4)
    第03组 Beta冲刺(1/4)
    Java程序(文件操作)
    Java程序(事件监听与计算机界面)
    Java(个人信息显示界面)
    Java(学生成绩管理)
  • 原文地址:https://www.cnblogs.com/james1207/p/3260493.html
Copyright © 2011-2022 走看看