hdu1290 - 献给杭电五十周年校庆的礼物 (递推求解)(找规律)

献给杭电五十周年校庆的礼物

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6878    Accepted Submission(s): 3726


Problem Description
或许你曾经牢骚满腹
或许你依然心怀忧伤
或许你近在咫尺
或许你我天各一方

对于每一个学子
母校 
永远航行在
生命的海洋

今年是我们杭电建校五十周年,这是一个值得祝福的日子。我们该送给母校一个怎样的礼物呢?对于目前的大家来说,最好的礼物当然是省赛中的好成绩,我不能参赛,就送给学校一个DOOM III球形大蛋糕吧,这可是名牌,估计要花掉我半年的银子呢。

想象着正式校庆那一天,校长亲自操刀,把这个大蛋糕分给各地赶来祝贺的校友们,大家一定很高兴,呵呵,流口水了吧...

等一等,吃蛋糕之前先考大家一个问题:如果校长大人在蛋糕上切了N刀(校长刀法极好,每一刀都是一个绝对的平面),最多可以把这个球形蛋糕切成几块呢?

做不出这个题目,没有蛋糕吃的!
为-了-母-校-,为-了-蛋-糕-(不是为了DGMM,枫之羽最会浮想联翩...),加-油-!
 

Input
输入数据包含多个测试实例,每个实例占一行,每行包含一个整数n(1<=n<=1000),表示切的刀数。
 

Output
对于每组输入数据,请输出对应的蛋糕块数,每个测试实例输出一行。
 

Sample Input
  
  
1 2 3
 

Sample Output
  
  
2 4 8
 

Author
lcy
 

Source
 
递推求解:
/****************************************
*
*   acm:   hdu-1290
*
*   title: 献给杭电五十周年校庆的礼物
*
*   time : 2014.5.17
*
*****************************************/

//考察递推求解


#include <stdio.h>
#include <stdlib.h>

int fun(int n)  //表示空间
{
    int g(int n);
    int res;

    if (n == 1)
    {
        res = 2;
    }
    else
    {
        res = fun(n - 1) + g(n - 1);
    }

    return res;
}

int g(int n) //表示平面
{
    int res;

    if (n == 1)
    {
        res = 2;
    }
    else
    {
        res = g(n - 1) + n;
    }

    return res;
}

int main()
{
    int n;

    while (~scanf("%d", &n))
    {
        printf("%d\n", fun(n));
    }

    return 0;
}

通过递推找到规律直接求解:
 
坑啊,推倒一半就不会捏到一起,无奈,思路如下:
 
f(n) = f(n -1) + g(n - 1)
 
g(n) = n*(n + 1) / 2 + 1
 
so: f(n) = f(n - 1) + (n - 1)*n/2 + 1
            = f(n - 2) + (n - 2)*(n - 1)/2 + 1 + (n - 1)*n/2 + 1
            ......
            = f(1) + 1*2/2 + 2*3/2 + 3*4/2 + 4*5/2 +.....+(n-1)*n/2 + (n-1)
            = 2 + 1 + 3 + 6 + 10 + 15 + ......+(n-1)*n/2 + n-1
 
1      +      2     ==     3
3      +      3     ==     6
6      +      4     ==    10
10    +      5     ==    15
15    +      6     ==    21
 
.........然后怎么归纳成和的形式?卡住 大哭
 
    ..............
           f(n)  = f(1) + 1*2/2 + 2*3/2 + 3*4/2 + 4*5/2 +.....+(n-1)*n/2 + (n-1)
                   =  2 + (1*2 + 2*3 + 3*4 +......+ (n-1)*n) / 2 + (n -1 )
                   =  2 + (1 + 2^2 -2 + 3^3 - 3 + 4^4 -4 +.......+ (n-1)^2 - n -1) / 2 + n + 1
                   =  (1 + 2^2 + 3^2 + 4^2 + ..... + n^2 -1 -2 -3 -......-n) / 2 + n + 1
                   = (n^3 +5n) / 6 + 1
 
 
/****************************************
*
*   acm:   hdu-1290
*
*   title: 献给杭电五十周年校庆的礼物
*
*   time : 2014.5.17
*
*****************************************/

//考察递推求解

//本题递推后归纳公式求解
/*

f(n) = f(n -1) + g(n - 1)
g(n) = n*(n + 1) / 2 + 1 

so:    f(n) = f(n - 1) + (n - 1)*n/2 + 1
            = f(n - 2) + (n - 2)*(n - 1)/2 + 1 + (n - 1)*n/2 + 1
            ......
            = f(1) + 1*2/2 + 2*3/2 + 3*4/2 + 4*5/2 +.....+(n-1)*n/2 + (n-1)
            =  2 + (1*2 + 2*3 + 3*4 +......+ (n-1)*n) / 2 + (n - 1)
            =  2 + (1 + 2^2 -2 + 3^3 - 3 + 4^4 -4 +.......+ (n-1)^2 - n -1) / 2 + n + 1
            =  (1 + 2^2 + 3^2 + 4^2 + ..... + n^2 -1 -2 -3 -......-n) / 2 + n + 1
            = (n^3 +5n) / 6 + 1
*/


#include <stdio.h>

int main()
{
    int n;

    while (~scanf("%d", &n))
    {
		printf("%d\n", (n*n*n +5*n) / 6 + 1);
    }

    return 0;
}

 
 
 
    
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值