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;
}
04-30 22:41