[ICPC2019 南昌站] And and Pair

題目描述:

給出一個數字 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的數量
答案即爲 3X2Y3^X*2^Y
不要忘了 全是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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章