/*
HDOJ 1465
错排公式与 _int64 类型的用法
*/
#include <stdio.h>
_int64 C[25];
_int64 Count(int n)
{
if(C[n] != 0)
return C[n];
else
{
C[n-1]=Count(n-1);
C[n-2]=Count(n-2);
//下面是错排公式
C[n]=(n-1)*(C[n-1]+C[n-2]);
return C[n];
}
}
int main()
{
C[1]=0;
C[2]=1;
int n;
while(scanf("%d",&n) != EOF)
{
printf("%I64d\n",Count(n));
}
return 0;
}
HDOJ 2044 一只小蜜蜂
/*
HDOJ 2044
f[n]表示的是输入的两个数 a,b之间的差值,通过观察,
可以得出 f[n]=f[n-1]+f[n-2] (n>2)
*/
#include <stdio.h>
int main()
{
_int64 f[55];
f[0]=1;
f[1]=1;
f[2]=2;
for(int i=3;i<51;i++)
f[i]=f[i-1]+f[i-2];
int n,a,b;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&a,&b);
a=b-a;
printf("%I64d\n",f[a]);
}
return 0;
}
HDOJ 2045 LELE的RPG问题
/*
HDOJ 2045 PRG难题
现在共有i个格子的时候,
如果第i-1个和第一个相同,那么第i-2个肯定就和第一个不一样
此时,最后一个可以有两种涂色方案
如果第i-1个和第一个不一样,那么最后一个格子只有一种颜色可以涂
所以 f[i]=f[i-1]+2*f[i-2] (i>3)
*/
#include <stdio.h>
int main()
{
int n,i,j;
_int64 f[51];
f[1]=3;
f[2]=6;
f[3]=6;
for(i=4;i<51;i++)
{
f[i]=f[i-1]+2*f[i-2];
}
while(scanf("%d",&n) != EOF)
{
printf("%I64d\n",f[n]);
}
return 0;
}
HDOJ 2046 骨牌铺方格
/*
HDOJ 2046 骨牌铺方格
有1*n个方格的时候,可以是在n-1个方格的时候,最后加上一张
也可以是在n-2个方格的时候,加上两张横放的。如果是加上两张竖放的
那就和竖放一张那种方案重复了。
所以 f(n)=f(n-1)+f(n-2); 斐波那契数列
*/
#include <stdio.h>
int main()
{
_int64 f[55];
int i,n;
f[0]=1;
f[1]=1;
f[2]=2;
f[3]=3;
for(i=4;i<=50;i++)
f[i]=f[i-1]+f[i-2];
while(scanf("%d",&n) != EOF)
printf("%I64d\n",f[n]);
return 0;
}
HDOJ 2047 阿牛的EOF牛肉串
/*
HDOJ 2047
f[n]表示长度为n的时候的方案数目。
加入第n个字符的时候,有几种选择,要看它前面的
当第n-1个是O的时候,那么它后面只可以是E or F,有两种选择
并且此时,第n-2个一定是 E/F。此时 f[n]=2*f[n-2];
当第n-1个不是O的时候,那么它的后面可以是 EOF 中任意一个。
此时,f[n]=3*f[n-1];起初我也认为,这样答案不就是 f[n]=3*f[n-1]+2*f[n-2]吗?
但是,其实这两种讨论是有重复的地方的,那就是在第一种情况中,
第n-2个是E/F的时候,和第二种情况的第n-1个是E/F的,情况是有重复的
当第n-2个是E/F时,包含了一种第n-1个E/F时的一种情况,所以要减去一个f[n-1];
所以 f[n]=2*(f[n-2]+f[n-1]);
*/
#include <stdio.h>
int main()
{
int n,i;
_int64 f[41];
f[1]=3;
f[2]=8;
f[3]=22;
for(i=4;i<41;i++)
f[i]=2*(f[i-1]+f[i-2]);
while(scanf("%d",&n) != EOF)
printf("%I64d\n",f[n]);
return 0;
}
HDOJ 2050 折线分割平面
#include <iostream>
using namespace std;
int Count(int n)
{
if(n == 1)
return 2;
else
{
int fn;
fn=Count(n-1)+4*(n-1)+1;
return fn;
}
}
int main()
{
int nCase,n;
cin>>nCase;
while(nCase--)
{
cin>>n;
cout<<Count(n)<<endl;
}
return 0;
}