杭电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;
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务