题目大意:
给定一个整数n。 你需要计算(n mod 1)或(n mod 2)或… 或者(n mod (n - 1))或者(n mod n) “或”操作是指“按位或”。
这里我打了一个前100个数的表,表的结果如下
可以看见当2^(cnt+1)<n<=2^(cnt+2)时,其结果为2^0+2^1+....+2^cnt,根据等比求和公式可以得到最后的结果为2^cnt+1
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int ksm(int base,int index){//快速幂算法
int res=1;
while(index>0){
if(index&1) res=res*base,index--;
index>>=1;
base=(base*base);
}
return res;
}
signed main(){
int T;cin>>T;
while(T--){
int n;cin>>n;if(n==1||n==2) cout<<0<<endl;
else{
int t=1,cnt=0;while(t*2<n) t*=2,cnt++;
cout<<ksm(2,cnt)-1<<endl;
}
}
}