Ankit_132

Break This Array

Jun 21st, 2023
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define INF 2047483647
  5.  
  6. #define ll long long
  7. #define MOD 1000000007
  8.  
  9. const int N = 505;
  10. ll dp[N][N][N];
  11.  
  12. ll inverse[N];
  13. void solve()
  14. {
  15.     int n,K;
  16.     cin>>n>>K;
  17.    
  18.     for(int i=0;i<=n;i++)
  19.     {
  20.         for(int j=0;j<=n;j++)
  21.         {
  22.             for(int k=0;k<=K;k++)
  23.                 dp[i][j][k] = 0;
  24.         }
  25.     }
  26.    
  27.     ll a[n];
  28.     for(int i=0;i<n;i++)
  29.         cin>>a[i];
  30.        
  31.     string s;
  32.     cin>>s;
  33.    
  34.     s="#"+s+"L";
  35.     dp[1][n][0] = 1;
  36.    
  37.     for(int k=1;k<=K+1;k++)
  38.     {
  39.         for(int len=n;len>0;len--)
  40.         {
  41.             for(int i=1;i<=n;i++)
  42.             {
  43.                 int j = i+len-1;
  44.                
  45.                 if( j>n ) continue;
  46.                
  47.                 if( k>1 and s[k-1] == 'L' )
  48.                 {
  49.                     dp[i][j][k-1]+=dp[i][j+1][k-1];
  50.                     dp[i][j][k-1]%=MOD;
  51.                 }
  52.                 else if(k>1 and s[k-1] == 'R')
  53.                 {
  54.                     dp[i][j][k-1]+=dp[i-1][j][k-1];
  55.                     dp[i][j][k-1]%=MOD;
  56.                 }
  57.                 if( i == j )
  58.                 {
  59.                     dp[i][j][k]+=dp[i][j][k-1];
  60.                     dp[i][j][k]%=MOD;
  61.                     continue;
  62.                 }
  63.                 ll div = inverse[j-i];
  64.                 div = div*dp[i][j][k-1];
  65.                 div%=MOD;
  66.                 if( s[k] == 'L' )
  67.                 {
  68.                     dp[i][j-1][k]+=div;
  69.                     dp[i][j-1][k]%=MOD;
  70.                 }
  71.                 else
  72.                 {
  73.                     dp[i+1][j][k]+=div;
  74.                     dp[i+1][j][k]%=MOD;
  75.                 }
  76.             }
  77.         }
  78.     }
  79.    
  80.    
  81.     ll sum[n+1] = {0};
  82.     for(int i=1;i<=n;i++)
  83.         sum[i] = (sum[i-1]+a[i-1])%MOD;
  84.    
  85.     ll res = 0;
  86.     for(int i =1;i<=n;i++)
  87.     {
  88.         for(int j=i;j<=n;j++)
  89.         {
  90.             ll x = dp[i][j][K]*(sum[j]-sum[i-1]+MOD);
  91.             x%=MOD;
  92.             (res+=x)%=MOD;
  93.         }
  94.     }
  95.    
  96.     cout<<res<<endl;
  97.  
  98. }
  99.  
  100.  
  101. int main(){
  102.     function<ll int(ll int)> InverseUnderModulo = [&](ll int x)
  103.     {
  104.         if(x == 1)
  105.             return 1ll;
  106.  
  107.         return (MOD - ((MOD/x) * InverseUnderModulo(MOD%x)) % MOD) % MOD;
  108.     };
  109.    
  110.     for(int i=1;i<N;i++) inverse[i] = InverseUnderModulo(i);
  111.     int tc=1;
  112.     cin>>tc;
  113.     while(tc--)
  114.         solve();
  115. }
Advertisement
Add Comment
Please, Sign In to add comment