杭电1:Mod, Or and Everything
题面:给定一个数n,求n%1,...,到n%(n-1)的按位或。
解析:按位或操作不改变二进制数的长度。答案与n取模的最大值有关,依题意知会出现1到n取模的最大值,所以所有数按位或后,结果的二进制数每一位都为1。
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll t,n; int main(){ cin>>t; while(t--){ ll ans=0; ll s=1; cin>>n; if(!n&1) n=n-1; ll x=n/2+1; x=n%x; while(x){ x=x>>1; ans=s+ans; s=s*2; } cout<<ans<<endl; } }