UVA - 13022 Sheldon Numbers(位运算)
UVA - 13022 Sheldon Numbers
二进制形式满足ABA,ABAB数的个数(A为一定长度的1,B为一定长度的0)。
其实就是寻找在二进制中满足所有的1串具有相同的长度,所有的0串也具有相同的长度,并且在给定范围内的个数。
位运算。通过分析不难发现,所有解不会很大,因此我们可以暴力,用两个for分别枚举0串和1串的长度,然后交替放入一个值内(注意先放1),同时更新答案。
将值存入set,发现所有满足条件的个数为4809(4810)。
ps:因为这里的2^63大于long long的范围,but也满足条件,在操作时无法对其进行模拟。本题数据并没有这种情况,可能是无意为之。
更为严谨的代码需要将2^63考虑在内(做一下特判),以下代码暂且按4809计算。
#include<bits/stdc++.h> using namespace std; typedef long long ll; set<ll> v; void init(){ for(int i=1;i<=63;i++){ for(int j=1;j<=63;j++){ int len=0,t=0; ll x=0ll; while(len<63){ if(t==0){ if(len+i>63) break; t=1; x<<=i; x|=(1ll<<i)-1; v.insert(x); len+=i; } else{ if(len+j>63) break; t=0; x<<=j; v.insert(x); len+=j; } } } } } int main() { init(); ll x,y; set<ll>::iterator it; while(~scanf("%lld%lld",&x,&y)){ ll ans=0; for(it=v.begin();it!=v.end();it++){ if(x<=*it){ if(*it>y) break; ans++; } } printf("%lld\n",ans); } return 0; }
博文系博主原创,转载请注明出处 o(* ̄▽ ̄*)ブ 更多博文源自https://www.cnblogs.com/yzm10