cf &的操作*3

传送门1

传送门2

给你一个字符串,问你有多少对相同长度的字符串 & 起来之后,恰好等于这个字符串,这个字符串的每个字符都是代表着0-63之间的数字。
'0'~'9'代表数字0~9
'A'~'Z'代表数字10~35
'a'~'z'代表数字36~61
'-'代表62
'_' 代表63

Input

输入一个字符串s,长度小于等于1e5,大于等于1

Output

输出答案,答案模1e9+7

Examples

Input
z
Output
3
Input
V_V
Output
9
Input
Codeforces
Output
130653412

Note

  1. z&_ = 61&63 = 61 = z
  2. _&z = 63&61 = 61 = z
  3. z&z = 61&61 = 61 = z

题意:

  给出字符串转化为数字,问有多少个 位 & 还是原来的数字

思路:

  把这些字符转化成数字后变成2进制,看有多少个0,如果有n个0,那么就是3的n次方;
  因为每一个为0的位置上可以有0&1,1&0,0&0,这3种情况,最后结果就是3的n次方了,快速幂

#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
map<char,int>mp;
void inint(){
    for(int i=0;i<=9;i++){
        mp[i+'0']=i;
    }
    for(int i=10;i<=35;i++){
        mp[i-10+'A']=i;
    }
    for(int i=36;i<=61;i++){
        mp[i-36+'a']=i;
    }
    mp['-']=62;
    mp['_']=63;
}
int main(){
    inint();
    string a;
    cin>>a;
    ll ans=1;
    for(int i=0;i<a.size();i++){
        int p=mp[a[i]];
        for(int j=0;j<6;j++){
            if(!((p>>j)&1)){
                ans=(ans*3)%mod;
            } 
        } 
    }    
    printf("%lld
",ans%mod);
}
原文地址:https://www.cnblogs.com/lipu123/p/14056118.html