• 【数学】【乱搞】【AOJ-331】汉诺塔


    Description
    大家都听说过汉诺塔吧?有n个圆盘由小到大排列,套在a柱上,每次只能移动一个圆盘,而且只能大的在下,小的在上,让你把a柱上的圆盘移到b柱,给你一个多余的c柱,问你最少移动多少次才能完成任务。
    Input
    输入有多组数据,每组包括一个整数n(n<=10000000),表示初始状态下有n个圆盘,当输入的n为0时,程序结束,n为负的情况不作处理。
    Output
    对每个输入,对应一行输出,每行输出包括一个整数,即移动的最小次数,因为数目非常大,所以请对9973求余后再输出。
    Sample Input
    1
    2
    3
    4
    0
     
    Sample Output
    1
    3
    7
    15


    思路:
    第n次移动时,需要把前n-1个移动到c上(假设开始在a,需全部移到b上),然后把第n个放在b上,再把前n个放在b上
    得到递推公式:f(n)=f(n-1)+1+f(n-1)
    用数学归纳法可证 f(n)=2^n-1
    先打表,依次算2^n会超时
     
    参考代码:
    #include <stdio.h> 
    int a[10000010]; 
    int main() 
    { 
        int n,m; 
        int i=1,sum=1; 
        int l=10000009; 
        while(l--) 
        { 
            sum=(sum%9973*2%9973)%9973; 
            a[i]=sum; 
            i++; 
        } 
        while(scanf("%d",&n)&&n) 
        { 
            if(n<0) 
                continue; 
            m=(a[n]-1)%9973; 
            printf("%d
    ",m); 
        } 
        return 0; 
    }
     
  • 相关阅读:
    List集合
    类加载机制
    代码优化
    JVM字节码
    Tomcat优化之Apache Jmeter压力测试工具
    Tomcat优化
    JVM垃圾收集器
    lambda表达式
    java 内部类
    java多线程3种方式
  • 原文地址:https://www.cnblogs.com/ahu-shu/p/3482303.html
Copyright © 2020-2023  润新知