Codeforces Round #355 (Div. 2) C

Description

While walking down the street Vanya saw a label "Hide&Seek". Because he is a programmer, he used & as a bitwise AND for these two words represented as a integers in base 64 and got new word. Now Vanya thinks of some string s and wants to know the number of pairs of words of length |s| (length of s), such that their bitwise AND is equal to s. As this number can be large, output it modulo 109 + 7.

To represent the string as a number in numeral system with base 64 Vanya uses the following rules:

  • digits from ‘0‘ to ‘9‘ correspond to integers from 0 to 9;
  • letters from ‘A‘ to ‘Z‘ correspond to integers from 10 to 35;
  • letters from ‘a‘ to ‘z‘ correspond to integers from 36 to 61;
  • letter ‘-‘ correspond to integer 62;
  • letter ‘_‘ correspond to integer 63.

Input

The only line of the input contains a single word s (1 ≤ |s| ≤ 100 000), consisting of digits, lowercase and uppercase English letters, characters ‘-‘ and ‘_‘.

Output

Print a single integer — the number of possible pairs of words, such that their bitwise AND is equal to string s modulo 109 + 7.

Examples

input

z

output

3

input

V_V

output

9

input

Codeforces

output

130653412

Note

For a detailed definition of bitwise AND we recommend to take a look in the corresponding article in Wikipedia.

In the first sample, there are 3 possible solutions:

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

给我们一下字符串,问我们可以通过&后,值依然和题目上规定的相同

我们当然可以先把0~63的先全部&一下,存下结果,然后,就一个字符一个字符的判断就好啦~

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<map>
 4 using namespace std;
 5 map<int,int> q;
 6 int main()
 7 {
 8     for(int i=0;i<=63;i++)
 9     {
10         for(int j=0;j<=63;j++)
11         {
12             q[i&j]++;
13         }
14     }
15     int pos;
16     long long num=1;
17     string s;
18     cin>>s;
19     for(int i=0;i<s.length();i++)
20     {
21         if(s[i]>=‘0‘&&s[i]<=‘9‘)
22         {
23             pos=s[i]-‘0‘;
24         }
25         else if(s[i]>=‘A‘&&s[i]<=‘Z‘)
26         {
27             pos=s[i]-‘A‘+10;
28         }
29         else if(s[i]>=‘a‘&&s[i]<=‘z‘)
30         {
31             pos=s[i]-‘a‘+36;
32         }
33         else if(s[i]==‘-‘)
34         {
35             pos=62;
36         }
37         else if(s[i]==‘_‘)
38         {
39             pos=63;
40         }
41         num=num*q[pos]%1000000007;
42     }
43     cout<<num<<endl;
44     return 0;
45 }
时间: 2024-08-28 11:30:19

Codeforces Round #355 (Div. 2) C的相关文章

Codeforces Round #355 (Div. 2) Vanya and Treasure

这是一道很显然的DP题目,状态转移在题目中也很直接,就是从k-1到k,然而如果count[k-1]*cnt[k],那么时间复杂度就会很大,本来的复杂度应该是O(p*n*n*m*m),用DP的话会很TLE,看了大牛的解释后,是在p<sqrt(mn)时候用DP,之后如果p>sqrt(nm)的话就用BFS,这样用均摊分析可以计算其时间复杂度(后边我打算写一篇关于均摊分析的博文). #include <iostream> #include <cstdio> #include &

Codeforces Round #355 (Div. 2) Vanya and Label

这道题很注重转化,其实质其实是将字符串每个字符转换成对应的数字后,按照6位进行二进制转化,然后统计0出现的次数,0&1=0,1&0=1,0&0=0,有些人用了快速幂,实际上这完全没有必要,但是一定要用long long. #include <iostream> #include <cstdio> #include <string> using namespace std; const long long MOD=1e9+7; string s;

Codeforces Round #355 (Div. 2)

A 弯腰 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<queue> 5 #include<stack> 6 #include<algorithm> 7 using namespace std; 8 #define clc(a,b) memset(a,b,sizeof(a)) 9 #define inf 0x3f3f3f3f 10 cons

Codeforces Round #355 (Div. 2) D. Vanya and Treasure 分治暴力

D. Vanya and Treasure Vanya is in the palace that can be represented as a grid n?×?m. Each room contains a single chest, an the room located in the i-th row and j-th columns contains the chest of type aij. Each chest of type x?≤?p?-?1 contains a key

Codeforces Round #355 (Div. 2) B

Description Vanya smashes potato in a vertical food processor. At each moment of time the height of the potato in the processor doesn't exceed h and the processor smashes k centimeters of potato each second. If there are less than k centimeters remai

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我