Codeforces Round #355 (Div. 2) C Vanya and Label快速幂取模

    xiaoxiao2025-02-12  21

                先预处理出每个字符可能的组合情况,然后 用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; }
    转载请注明原文地址: https://ju.6miu.com/read-1296346.html
    最新回复(0)