Advertisement
willy108

cow poetry

Feb 12th, 2021
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include <cstdio> //casually deletes all STL lib since i can't use "head" if i include them
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <ctime>
  5. #include <cmath>
  6. #include <cassert>
  7. #define max_v 5010
  8. #define LOGN 50
  9. #define int_max 0x3f3f3f3f
  10. #define cont continue
  11. #define byte_max 0x3f
  12. #define pow_2(n) (1 << (n))
  13. //tree
  14. #define lsb(n) ((n)&(-(n)))
  15. #define LC(n) (((n) << 1) + 1)
  16. #define RC(n) (((n) << 1) + 2)
  17. #define LOG2(n) ((int)(ceil(log2((n)))))
  18. using namespace std;
  19.  
  20. const long long mod = 1e9 + 7;
  21. int  dp[max_v][max_v];
  22. int c[max_v], s[max_v], groups[120];
  23. int n, m, k;
  24.  
  25. int bin_pow(int a, int b){
  26.   //a^b % c;
  27.   long long ans = 1ll;
  28.   long long ind = (long long)a;
  29.   for(int i = 0; pow_2(i) <= b; i++){
  30.     if(b & pow_2(i)){
  31.       ans *= ind;
  32.       ans %= mod;
  33.     }
  34.     ind = (ind * ind) % mod;
  35.  
  36.   }
  37.   return ans;
  38. }
  39.  
  40.  
  41. int main(){
  42.   //freopen("poetry.in", "r", stdin);
  43.   //freopen("poetry.out", "w+", stdout);
  44.     scanf("%d%d%d", &n, &m, &k);
  45.   for(int i = 0; i<n; i++){
  46.     scanf("%d%d", &s[i], &c[i]);
  47.   }
  48.   for(int i = 0; i<m; i++){
  49.     static char str[10];
  50.     scanf("%s", str);
  51.     groups[str[0]]++;
  52.   }
  53.  
  54.   dp[0][0] = 1;
  55.   for(int i = 0; i<=k; i++){
  56.     int t = 0;
  57.     for(int j = 0; j<=n; j++) t = (t + dp[i][j]) % mod;
  58.    
  59.     for(int j = 0; j<n; j++){
  60.      
  61.       if(i + s[j] < max_v) (dp[i + s[j]][c[j]] += t) %= mod;
  62.  
  63.       //printf("%3d", dp[i][j]);
  64.     }
  65.     //puts("");
  66.   }
  67.  
  68.   long long ans = 1ll;
  69.  
  70.   for(int i = 'A'; i<='Z'; i++){
  71.     long long temp = 0ll;
  72.     if(groups[i] == 0) cont;
  73.     for(int j = 1; j<=n; j++){ //over every group, if none in group, dp would be 0 so no effect
  74.       (temp += (long long)bin_pow(dp[k][j], groups[i])) %= (long long)mod;
  75.     }
  76.     //printf("for %d there are %lld ways\n", i, temp);
  77.     ans *= temp;
  78.     ans %= (long long)mod;
  79.   }
  80.  
  81.   printf("%lld\n", ans);
  82.  
  83.  
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement