zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    求a,b在区间上的公倍数个数
    最长非上升子序列的长度
    uva 11992 线段树
    hdu 5464 dp
    hdu 5465 树状数组
    hdu 5459 递推
    poj 2528 动态线段树
    hdu 4474 bfs
    ural 1495 bfs
    hdu 2795 线段树
  • 原文地址:https://www.cnblogs.com/lipu123/p/14056118.html
Copyright © 2011-2022 走看看