Manioc

Cantor

Jul 27th, 2018
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 107
  3.  
  4. using namespace std;
  5. typedef long long ll;
  6.  
  7. ll bit[MAX],C[11], base;
  8. map<ll, ll> dp[MAX];
  9. ll dfs(int pos, int val, int flag, int ini){
  10.     //if(pos == 0 ) cout << rep << endl;
  11.     if(pos == 0) return val != 0;
  12.     if(!flag && dp[pos].count(val)) return dp[pos][val];
  13.  
  14.     ll ans = 0;
  15.  
  16.     int end = flag? bit[pos]: (base-1);
  17.     for(int i = 0; i <= end; i++){
  18.         if(!C[i] && i == 0 && ini) ans = ans + dfs(pos-1, val+i, flag && i == end, true);
  19.         if(!C[i]) continue;
  20.         ans = ans + dfs(pos-1, val+i, flag && i == end, false);
  21.     }
  22.     if(!flag) dp[pos][val] = ans;
  23.     return ans;
  24. }
  25.  
  26. bool check(ll a){
  27.     int len = 0;
  28.     while(a){
  29.         bit[++len] = a%base;
  30.         a /= base;
  31.     }
  32.  
  33.     for(int i = 1; i <= len; i++){
  34.         if(!C[i]) return false;
  35.     }
  36.     return true;
  37. }
  38. ll solve(ll a){
  39.     int len = 0;
  40.     while(a){
  41.         bit[++len] = a%base;
  42.         a /= base;
  43.     }
  44.    
  45.     return dfs(len, 0, true, true);
  46. }
  47. int main(){
  48.     while(true){
  49.         for(int i = 0; i < MAX; i++) dp[i].clear();
  50.         string conjunto;
  51.         ll a, b; cin >> a >> b >> base >> conjunto;
  52.         if( a+b+base == -3) break;
  53.         for(int i = 0; i < conjunto.size(); i++){
  54.             if(conjunto[i] == 'S') C[i] = true;
  55.             else C[i] = false;
  56.         }
  57.         cout << solve(b)-solve(a)+check(a) << endl;
  58.     }
  59.     return 0;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment