如果一个数为奇数,其所有因子一定为奇数,且成对出现,所以只有当一个奇数为某数的平方时,他的因数和才是奇数。
如果一个数为偶数,其所有的奇因子一定是将这个偶数的素因子2消去之后所得的奇数的因子。
所以预处理一个x*x*2^n的组合的表,查询的时候二分就好了。
#include
#include
#include
#include
#include
using namespace std; typedef long long ll; ll x[1000010];int xi; void gen(){ ll i,j; xi=0; for(i=1;i*i<=INT_MAX;++i){ for(j=1;j*i*i<=INT_MAX;j<<=1) x[xi++]=j*i*i; } sort(x,x+xi); xi=unique(x,x+xi)-x; }; int bfi(ll a){ int b=0,d=xi-1,m,r; while(b<=d){ m=(b+d)>>1; if(x[m]<=a) r=m,b=m+1; else d=m-1; } return r+1; }; int solve(){ ll n; scanf("%lld",&n); return bfi(n)&1; }; int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif gen(); int f; scanf("%d",&f); while(f--) printf("%d\n",solve()); return 0; };