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 ",f(n)); } return 0; }