USACO Feb. 2012

Moo

找规律 吧

第一个是很久以前自己写的递归

#include<stdio.h>
__int64 n;
__int64 dfs(__int64 l,__int64 r,__int64 k)
{
	//printf("%I64d %I64d
",l,r);
	//	return 1;
	__int64 kk = (r - k - 3)/2,temp;
	if(n>kk&&n<=kk+k+3)
	{
		//printf("%I64d %I64d
",n,kk);
		if(n==kk+1)
			return 1;
		else
			return 0;
	}
	else if(n<=kk)
	{
		temp = dfs(1,1+kk-1,k-1);
	}
	else if(n>kk+k+3)
	{
		n=n-(r-kk);
		temp = dfs(1,1+kk-1,k-1);
	}
	return temp;
}
int main()
{
	__int64 r=3,count=0;
	scanf("%I64d",&n);
	while(n>r)
	{
		r = r*2 + count + 4;
		count++;
	}
	if(dfs(1,r,count))
		printf("m
");
	else
		printf("o
");
	return 0;
}


 

Overplanting

Cow IDs

居然1A好开心

枚举第一个1在i位 i+1位 i+2位 。。。 那么有 C(i-1,k-1) + C(i,k-1)+C(i+1,k-1)。。。种 直到大于n

那么第1个1就确定了

然后重复以上步骤 确定第2个 第三个1。。

#include <stdio.h>
int C(int n,int m)
{
	int ret = 1,i;
	for(i = 1;i <= m; i++)
	{
		ret *= n--;
		ret /= i;
	}
	return ret;
}
int main()
{
	int a[13],len = 0;
	int n,m,k,i,j,sum = 0;
	scanf("%d %d",&n,&k);
	while(n)
	{
		sum = 0;
		m = k - 1;
		if(k == 1)
		{
			a[len++] = n;
			break;
		}
		for(i = m; ; i++)
		{
			int temp = C(i,m);
			if(sum + temp < n)
				sum += temp;
			else
			{
				n -= sum;
				a[len++] = i + 1;
				k--;
				break;
			}
		}
	}
	a[len] = 0;
	for(i = 1;i <= len; i++)
	{
		printf("1");
		int temp = a[i-1] - a[i];
		for(j = 1;j < temp; j++)
			printf("0");
		//printf("1");
	}
	puts("");
	return 0;
}