Mod, Or and Everything HDU - 6950
题意:
给你一个n,问(n%1) or (n%2) or … or (n %n)的值
题解:
无论n为奇偶,定义m=(n-1)/2,
我们发现n mod i<=m,而当i<=m时,有n mod (n-i) =i ,于是就有n mod i 取到0 ~ m的所有整数,那0 ~ m的所有or不就是m的位数全是1,m的位数全是1怎么求,可以直接按照位数求,也可以用lowbit求,都一样
代码:
#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
typedef long long ll;
using namespace std;
//qdu打铁匠
const ll INF=0x3f3f3f3f;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
int main()
{int t;cin>>t;while(t--){ll n;cin>>n;if(n==1||n==2){cout<<0<<endl;continue;}ll w=(n-1)/2;ll num=0;while(w){num++;w>>=1;}ll tot=0;while(num--){tot=tot<<1|1;}cout<<tot<<endl;} return 0;
}