hdu2608 0 or 1

如果一个数为奇数,其所有因子一定为奇数,且成对出现,所以只有当一个奇数为某数的平方时,他的因数和才是奇数。

如果一个数为偶数,其所有的奇因子一定是将这个偶数的素因子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; }; 
       
      
      
     
     
    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值