先预处理出每个字符可能的组合情况,然后 用map存各个字符出现的字数,最后快速幂一下就好了。。算是codeforces 里面C题中比较简单的一道了。。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int cnt[65];
const int mod = 1e9+7;
char s[100010];
map<int, int>mp;
int change(char ch)
{
if(ch >= '0' && ch <= '9')
return ch-'0';
if(ch >= 'A' && ch <= 'Z')
return ch-'A'+10;
if(ch >= 'a' && ch <= 'z')
return ch-'a'+36;
if(ch == '-')
return 62;
if(ch == '_')
return 63;
}
ll mypow(ll n, ll t)
{
ll ans = 1;
while(t)
{
if(t%2 == 1)
ans = ans*n%mod;
n = n*n%mod;
t >>= 1;
}
return ans;
}
int main()
{
ll ans = 1;
mp.clear();
for(int i = 0; i <= 63; i++)
{
int num = 0;
for(int j = 0; j <= 63; j++)
{
for(int k = 0; k <= 63; k++)
{
if((j&k) == i)//==运算符的优先级比较高。。
{
num++;
//if(i == 61)
//printf("j:%d k:%d i:%d\n", j, k, i);
}
}
}
cnt[i] = num;
}
scanf("%s", s);
int len = strlen(s);
for(int i = 0; i < len; i++)
mp[change(s[i])]++;
for(int i = 0; i <= 64; i++)
{
if(mp[i])
{
ans = ans*mypow((ll)cnt[i], (ll)mp[i])%mod;
//printf("i:%d cnt[i]:%d ans:%I64d\n", i, cnt[i], ans);
}
}
printf("%I64d\n", ans);
return 0;
}