Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //TIOJ 2052
- #include <bits/stdc++.h>
- using namespace std;
- int C[1025][1025];
- int cnt[100];
- int d;
- string s;
- string alph = "_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
- int ord(char c){
- if('A' <= c && c <= 'Z')return c-'A'+1;
- if('a' <= c && c <= 'z')return c-'a'+27;
- return -1;
- }
- int calc(int len){
- int ret = 1, sum = 0;
- for(int i = 1; i < alph.size(); ++i){
- if(cnt[i] == 0)continue;
- sum += cnt[i];
- ret = ret * C[sum][cnt[i]] % d;
- //cout << alph[i] << ' ' << ret << ' ';
- }
- //cout << endl;
- return ret;
- }
- void init(){
- for(unsigned i = 0; i < s.size(); ++i)++cnt[ord(s[i])];
- for(int i = 1; i <= s.size(); ++i){
- for(int j = 0; j <= i; ++j){
- if(j == 0 || j == i)C[i][j] = 1;
- else C[i][j] = (C[i-1][j] + C[i-1][j-1]) % d;
- }
- }
- }
- int32_t main(){
- int ans = 0;
- cin >> d >> s;
- init();
- for(unsigned i = 0; i < s.size(); ++i){
- for(int c = 1; alph[c] < s[i]; ++c){
- if(cnt[c] == 0)continue;
- //cout << alph[c] << endl;
- --cnt[c];
- ans = (ans + calc(s.size()-i-1)) % d;
- ++cnt[c];
- }
- --cnt[ord(s[i])];
- }
- cout << ans << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement