题意:x支队伍比赛,如果x为偶数,则比赛x/2场,一直递归循环下去,知道x为奇数, 若x为奇数,则比(x)*(x-1)/2 场,x=1则不用比了, 现给出总比赛场数n,求出所有x
这道题思路很简单,设刚开始队伍数为d=2^p*x,其中x是奇数,则比赛场次n=(2^p-1)*x+(x-1)*x/2,然后从0开始枚举p的值,接着解一元二次方程x^2+(2^(p+1)-3)x-2*n=0,
易知此方程在0到10^9直接有且只有一个解。直接二分就行。
#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;
typedef __int64 LL;
LL maxn =1500000000;
int main()
{
int i,j,f;
LL n,left,right,mid,mul,x;
while(~scanf("%I64d",&n))
{
f=1;
for(i=0; (mul=((LL)1<<i)-1)<=n; i++)
{
left=1;
right = mul ? min(maxn, n/mul+1 ) : maxn;
while(left<=right)
{
mid=(left+right)>>1;
x=mul*mid+(mid-1)*mid/2;
if(x<n)
{
left=mid+1;
}
else if(x>n)
{
right=mid-1;
}
else break;
}
x=mul*mid+(mid-1)*mid/2;
if(x==n&&(mid&1))
{
f=0;
printf("%I64d\n",mid<<i);
}
}
if(f) puts("-1");
}
return 0;
}