找规律,对每一对11,考虑单对的贡献。
注意输入输出格式和边界问题(i <= 61),虽然最后now会爆long long 但是下次并不会进循环了。
#include"bits/stdc++.h"
using namespace std;
typedef long long LL;
const LL mod = (LL) 1e13;
LL n,ans[2];
void work(LL x){
LL now = 3,mul = 1;
ans[0] = 0, ans[1] = 0;
for(LL i = 0; i <= 61 && now<=x; i++){
LL num = x>>(i+2);
if((x&now) == now){
ans[0] += x%mul+1;
ans[1] += ans[0]/mod;
ans[0] %= mod;
}
ans[0] += num*mul;
ans[1] += ans[0]/mod;
ans[0] %= mod;
now <<= 1;
mul <<= 1;
}
}
int main()
{
int cas = 0;
while(scanf("%lld",&n),n >= 0){
work(n);
printf("Case %d: ",++cas);
if(ans[1]){
printf("%lld",ans[1]);
printf("%013lld\n",ans[0]);
}
else printf("%lld\n",ans[0]);
}
return 0;
}