/*有N个士兵站成一队列, 现在需要选择几个士兵派去侦察。
为了选择合适的士兵, 多次进行如下操作: 如果队列超过三个士兵, 那么去除掉所有站立位置为奇数的士兵, 或者是去除掉所有站立位置为偶数的士兵。
直到不超过三个战士,
他们将被送去侦察。现要求统计按这样的方法,总共可能有多少种不同的正好三个士兵去侦察的士兵组合方案*/
#include
int function(int n,int m)
{
int i,
ret = 1;
for(i=0;i ret*=(n-i);
return ret;
}
int cal(int n){
if(n < 3)return 0;
if(n == 3)return 1;
if(n%2 == 0)
{
if(n/2>=3)
return 2*function(n/2,3)/function(3,3);
else
return 2*cal(n/2);
}
else
{
if(n/2>=3)
return function(n/2+1,3)/function(3,3)+function(n/2,3)/function(3,3);
else
return cal(n/2) + cal(n/2+1);
}
}
int main(){
int N;
while(scanf("%d", &N) > 0)
printf("%d\n", cal(N));
return 0;
}
//组合公式C(7,3)=7*6*5/3*2*1
/*int function(int n,int m)
{
int i,
ret = 1;
for(i=0;i ret*=(n-i);
return ret;
}
void main(void)
{ int n,m;
int ret;
scanf("%d,%d",&m,&n);
getchar();
ret = function(m,n) / function(n,n);
printf("%d\n",ret);
getchar();
}
//求n的阶层,采用自调用的方式
/*
int fix(int m)
{
if(m==1)
return 1;
if(m>1)
return m*fix(m-1);
}
int main()
{
int m;
int i;
do{
scanf("%d",&m);
getchar();
if(m>0&&m<256)
i=fix(m);
else
break;
printf("i=%d",i);
getchar();
}while(1);
}
*/
阅读(2470) | 评论(0) | 转发(0) |