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; }