比赛 20110729 评测结果 AATTTTTTTT
题目名称 01环 最终得分 20
用户昵称 苏轼 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-07-29 11:39:48
显示代码纯文本
#include <cstdio>
#include <set>
using namespace std;

int N,K,re;
bool check(const int &p)
{
	if (p==0)
		return false;
	int j=0;
	for(int i=0;i<N;i++)
		if (p&(1<<i))
			j=0;
		else
		{
			j++;
			if (j>K)
				return false;
		}
	for(int i=0;i<N;i++)
		if (p&(1<<i))
			break;
		else
		{
			j++;
			if (j>K)
				return false;
		}
	return true;
}

set<int> hash;
int main()
{
	freopen("01ring.in","r",stdin);
	freopen("01ring.out","w",stdout);
	int T,MO;
	scanf("%d%d",&T,&MO);
	while(T--)
	{
		scanf("%d%d",&N,&K);
		if (K==0)
		{
			printf("1\n");
			continue;
		}
		hash.clear();
		re=0;
		for(int i=0;i<(1<<N);i++)
			if (K>=N || check(i))
			{
				int small=i,k=i;
				for(int j=1;j<N;j++)
				{
					k=(k>>1)+((k&1)<<(N-1));
					if (k<small)
						small=k;
				}
				if (!hash.count(small))
				{
					re++;
					hash.insert(small);
				}
			}
		printf("%d\n",re);
	}
}