USACO Feb. 2012

Moo

找规律 吧

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

#include<stdio.h>

__int64 n;

__int64 dfs(__int64 l,__int64 r,__int64 k)

{

	//printf("%I64d %I64d\n",l,r);

	//	return 1;

	__int64 kk = (r - k - 3)/2,temp;

	if(n>kk&&n<=kk+k+3)

	{

		//printf("%I64d %I64d\n",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\n");

	else

		printf("o\n");

	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;

}


 

 

你可能感兴趣的:(USACO)