题目大意:
给定一个函数 f(x)=g(x+1)+g(x+2)+.....+g(x∗2) ,其中 g(x)=[x的二进制表示有且仅有3个1] 。给你 N(N<=100) 个输入,每个输入给你一个 m(m<=231−1) ,要你求出 f(x)=m是否存在唯一的整数解 ,存在输出 YES ,否则输出 NO 。
解题思路:
首先我们考虑函数
f(x)
的单调性,
f(x+1)−f(x)=g(x∗2+2)+g(x∗2+1)−g(x+1)
,从
g(x)
的定以来看,那么有:
g(x)=g(x∗2)
。所以
f(x+1)−f(x)=g(x∗2+1)
,所以我们可以发现
f(x)
是单调不降的。那么如果
f(x0)=m
是有唯一解得话,那么就要满足
f(x0+1)−f(x0)=1,f(x0)−f(x0−1)=1⇔g(x0∗2+1)=g(x0∗2−1)=1
。然后我们观察发现,满足上述条件的数的二进制一定是
1000..000...000010
所以
x0=2t+2+2(t>=0)
,然后我们分类讨论一下发现
f(2t+2+2)=(t+22)+1
,所以我们要做的就是对于
f(2t+2+2)=(t+22)+1=m是否有非负整数解
。
这很好做,再次不再赘述。
AC代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#define sqr(a) ((a)*(a))
using namespace std;
const double eps=1e-8;
int n;
int main()
{
scanf("%d",&n);
for(;n>0;n--)
{
long long m;
scanf("%lld",&m);
if(m<=1)
{
puts("NO");
continue;
}
long long a=1,b=3,c=-2*m+4;
long long delta=sqr(b)-4*a*c;
long long haha=(long long)(sqrt(delta)+eps);
if(sqr(haha)==delta)
puts("YES");
else puts("NO");
}
return 0;
}