人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深Cole终于知道了原因,原来,LELE最近研究起了著名的RPG难题:
有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.
以上就是著名的RPG难题.
如果你是Cole,我想你一定会想尽办法帮助LELE解决这个问题的;如果不是,看在众多漂亮的痛不欲生的Cole女的面子上,你也不会袖手旁观吧?
Input
输入数据包含多个测试实例,每个测试实例占一行,由一个整数N组成,(0<n<=50)。
Output
对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。
Sample Input
1
2
Sample Output
3
6
#include<queue>
#include<algorithm>
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
using namespace std;
long long int s[60][3],i,j,k;
int main()
{
s[1][0]=1;
s[1][1]=1;
s[1][2]=1;
s[2][0]=2;
s[2][1]=2;
s[2][2]=2;
s[3][0]=2;
s[3][1]=2;
s[3][2]=2;
for(i=4;i<51;i++)
{
s[i][0]=s[i-1][0]+2*s[i-2][0];
s[i][1]=s[i-1][1]+2*s[i-2][1];
s[i][2]=s[i-1][2]+2*s[i-2][2];
}
for(;;)
{
long long n;
if(scanf("%lld",&n)==EOF)
break;
printf("%lld\n",s[n][0]+s[n][1]+s[n][2]);
}
}
今年的ACM暑期集训队一共有18人,分为6支队伍。其中有一个叫做EOF的队伍,由04级的阿牛、XC以及05级的COY组成。在共同的集训生活中,大家建立了深厚的友谊,阿牛准备做点什么来纪念这段激情燃烧的岁月,想了一想,阿牛从家里拿来了一块上等的牛肉干,准备在上面刻下一个长度为n的只由"E" "O" "F"三种字符组成的字符串(可以只有其中一种或两种字符,但绝对不能有其他字符),阿牛同时禁止在串中出现O相邻的情况,他认为,"OO"看起来就像发怒的眼睛,效果不好。
你,NEW ACMer,EOF的崇拜者,能帮阿牛算一下一共有多少种满足要求的不同的字符串吗?
PS: 阿牛还有一个小秘密,就是准备把这个刻有 EOF的牛肉干,作为神秘礼物献给杭电五十周年校庆,可以想象,当校长接过这块牛肉干的时候该有多高兴!这里,请允许我代表杭电的ACMer向阿牛表示感谢!
再次感谢!
Input
输入数据包含多个测试实例,每个测试实例占一行,由一个整数n组成,(0<n<40)。
Output
对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。
Sample Input
1
2
Sample Output
3
8
#include<queue>
#include<algorithm>
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
using namespace std;
int main()
{
for(;;)
{
long long int dp[1000][3];
long long int i,j,k,n;
if(scanf("%lld",&n)==EOF)
break;
dp[1][0]=1;
dp[1][1]=1;
dp[1][2]=1;
for(i=2;i<=n;i++)
{
for(j=0;j<3;j++)
{
if(j<2)
{
dp[i][j]=dp[i-1][0]+dp[i-1][1]+dp[i-1][2];
}
else
dp[i][j]=dp[i-1][0]+dp[i-1][1];
}
}
printf("%lld\n",dp[n][0]+dp[n][1]+dp[n][2]);
}
}
国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样的:
首先,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排;
然后,让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个.
最后,揭开盖头,如果找错了对象就要当众跪搓衣板...
看来做新郎也不是容易的事情...
假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.
Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C行数据,每行包含两个整数N和M(1<M<=N<=20)。
Output
对于每个测试实例,请输出一共有多少种发生这种情况的可能,每个实例的输出占一行。
Sample Input
2
2 2
3 2
Sample Output
1
3
#include<queue>
#include<algorithm>
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
typedef long long LL;
using namespace std;
LL s[60],jie[30],i,j,k;
int main()
{
s[1]=0;
s[2]=1;
for(i=3;i<21;i++)
{
s[i]=(i-1)*(s[i-1]+s[i-2]);
}
jie[0]=1;jie[1]=1;jie[2]=2;
for(i=3;i<21;i++)
{
jie[i]=jie[i-1]*i;
}
int T;
scanf("%d",&T);
while(T--)
{
LL m,n;
scanf("%lld %lld",&n,&m);
printf("%lld\n",jie[n]/jie[m]/jie[n-m]*s[m]);
}
return 0;
}
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。
Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。
Output
对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。
Sample Input
2
1
2
Sample Output
2
7
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
#define INF 1e-9
#define MAXN 1e9
int main()
{
LL a[10010],i,j,k,t;
a[1]=2;a[2]=7;
for(i=3;i<=10001;i++)
{
a[i]=a[i-1]+4*(i-1)+1;
}
LL T;
scanf("%lld",&T);
while(T--)
{
LL n;
scanf("%lld",&n);
printf("%lld\n",a[n]);
}
}