題目描述:
給出一個數字 N (以二進制形式給出)
然後尋找數對 (i,j) 滿足
1:1<=j<=i<=n
2:i&n=i
3:j&i=0
題目分析:
首先 第二個條件
對於 n 中的二進制0位置i只能取0,1位置 i 可以取 1 或者 0
對於 i 的1位置,j只能取 0 ,對於 i 的0位置 j可以取 1 或者 0
對於 j<=i這個條件 我們只需要讓j取到的最高1位置小於i的最高一位置就行了
所以我們從小到大枚舉N的二進制位數
當我們找到1的時候,以這個位置作爲最高位即可
設 X爲當前1的數量(不包括最高位),Y爲當前0的數量
答案即爲
不要忘了 全是0的一種情況。
題目鏈接:
AC代碼:
#include <cstdio>
#include <iostream>
#include <cstring>
const int maxm=1e5+100;
const int mod=1e9+7;
long long num3[maxm],num2[maxm];
char s[maxm];
int main()
{
int t;
scanf("%d",&t);
num3[0]=num2[0]=1ll;
for(int i=1;i<=100000;i++) num2[i]=(num2[i-1]*2ll)%mod,num3[i]=(num3[i-1]*3ll)%mod;
while(t--)
{
long long ans=0;
scanf("%s",s);
int len=strlen(s);
int x=0,y=0;
for(int i=len-1;i>=0;i--)
{
if(s[i]=='1')
{
ans=(ans+(num3[x]*num2[y])%mod)%mod;
x++;
}
else y++;
}
ans=(ans+1)%mod;
printf("%lld\n",ans);
}
return 0;
}