题面:给定一个数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;
}
}


京公网安备 11010502036488号