您的位置:首页 > 其它

CF677C Vanya and Label

2016-06-07 13:09 351 查看
其实这是一条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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces