9519 偷吃(递推)

9519 偷吃

该题有题解

时间限制:1000MS  内存限制:65535K
提交次数:251 通过次数:73

题型: 编程题   语言: G++;GCC

 

Description

    超牛和lyd最近买了好多零食啊,可是呢,因为龙教很贪吃,经常偷吃他们的东西。
    为了要让龙教吃不到,他们想到了个方法,他们叫pkkj给他们n个箱子,然后他们就把箱子排成一列,把他们买回来的三种零食(包括薯片,果冻还有饼干)放进那里面。
    然后让龙教猜箱子里面的食物,只有两次机会,猜不到就没得吃。
    所以他们想让相邻的箱子里面放的东西不相同(如果箱子数大于1,那么头尾的食物也不能相同)。
    他们想知道到底有多少种放法,因为他们迷上三国杀,懒得想,所以就请聪明的你帮他们算算吧。




输入格式

    输入数据包含多个测试实例,每个测试实例占一行,即pkkj给他们的箱子数n,(0<n<=50)。 



输出格式

    对于每个测试实例,请输出全部的满足要求的放法,每个实例的输出占一行。



 

输入样例

1
2



 

输出样例

3
6



题解

用递推式做。
an表示n个格子放m种东西方法数,
那么an=m*(m-1)^(n-1) - 首尾相同的个数的情况
假设首尾相同 那么首尾可以看成一件物品
那么就是a(n-1)了
所以递推公式就是an=m*(m-1)^(n-1)-a(n-1)
其他注意地方,n最大为50,所以要用long long防止溢出

 

#include <iostream>
#include <cstdio>
using namespace std;
long long pow(long long di,int zhi)
{
    long long ans=1;
    for (int i=0;i<zhi;i++)
    ans*=di;
    return ans;
}
long long f(int n)
{
    if (n==1)
    return 3;
    if (n==2)
    return 6;
    return 3*pow(2,n-1)-f(n-1);
}
int main()
{
    int n;
    while (scanf("%d",&n)>0)
    {
        printf("%lld\n",f(n));
    }
    return 0;
}

 

posted @ 2016-05-26 20:22  酱油党gsh  阅读(259)  评论(0编辑  收藏  举报