CF677C Vanya and Label


其实这是一条Codeforces上的水题,但是想要做对也不容易……例如我就没想出方法,最后只好看题解才做出。

这题要判断有多少种方法通过逻辑与“&”来获得输入的字符串,其中每个字符对应的数值如上面描述。由于字符的数值的范围为0~63,即2^6-1,那么每个字符可以转化为6位的二进制数,然后我们用一个循环来统计这个字符串所有字符转化为二进制后一共有多少位数为“0”即可,因为当一个位为“0”的时候,那么这一位就可以由3种情况获得:0&0,1&0,0&1,而当一位为”1“时,只有1&1一种方法获得;因此最后的结果为3^n,其中n代表转化为二进制后为”0”的位的数目。最后还要记得 mod 10^9+7,由于3*(10^9+7)会超过int的范围,因此我们需要用long long来存储。

代码:

#include <bits/stdc++.h>
using namespace std;
int Map[256];
void init()
{
	for(int i = '0';i<='9';i++)
	{
		Map[i] = i-'0'; 
	}
	for(int i = 'A';i<='Z';i++)
	{
		Map[i] = i-'A'+10;
	}
	for(int i = 'a';i<='z';i++)
	{
		Map[i] = i-'a'+36;
	}
	Map['-']=62;
	Map['_']=63;
}
int Cal(char c)
{
	int dec = Map[c];
	int one = 0;
	while(dec>0)
	{
		if(dec%2==1) one++;
		dec/=2;
	}
	return 6-one;
}
int main()
{
    init();
    string s;
    cin>>s;
    int cnt=0;
    long long result = 1;
    for(int i=0;i<s.size();i++)
    {
    	cnt += Cal(s[i]);
    }
    for(int i=1;i<=cnt;i++)
    {
    	result = (3*result) % 1000000007;
    }
    cout<<result<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值