UVA_10940
列举出前有限项就会发现规律,f(1)=1,f(n)=f(2^m+k)=2*k,其中k<=2^m<n。
#include<stdio.h>
#include<string.h>
#define MAXD 500010
int f[MAXD], N;
void prepare()
{
int i, k;
k = 1;
f[1] = 1;
for(i = 2; i <= 500000; i ++)
{
if(k * 2 < i)
k *= 2;
f[i] = 2 * (i - k);
}
}
int main()
{
prepare();
for(;;)
{
scanf("%d", &N);
if(!N)
break;
printf("%d\n", f[N]);
}
return 0;
}