Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define INF 2047483647
- #define ll long long
- #define MOD 1000000007
- const int N = 505;
- ll dp[N][N][N];
- ll inverse[N];
- void solve()
- {
- int n,K;
- cin>>n>>K;
- for(int i=0;i<=n;i++)
- {
- for(int j=0;j<=n;j++)
- {
- for(int k=0;k<=K;k++)
- dp[i][j][k] = 0;
- }
- }
- ll a[n];
- for(int i=0;i<n;i++)
- cin>>a[i];
- string s;
- cin>>s;
- s="#"+s+"L";
- dp[1][n][0] = 1;
- for(int k=1;k<=K+1;k++)
- {
- for(int len=n;len>0;len--)
- {
- for(int i=1;i<=n;i++)
- {
- int j = i+len-1;
- if( j>n ) continue;
- if( k>1 and s[k-1] == 'L' )
- {
- dp[i][j][k-1]+=dp[i][j+1][k-1];
- dp[i][j][k-1]%=MOD;
- }
- else if(k>1 and s[k-1] == 'R')
- {
- dp[i][j][k-1]+=dp[i-1][j][k-1];
- dp[i][j][k-1]%=MOD;
- }
- if( i == j )
- {
- dp[i][j][k]+=dp[i][j][k-1];
- dp[i][j][k]%=MOD;
- continue;
- }
- ll div = inverse[j-i];
- div = div*dp[i][j][k-1];
- div%=MOD;
- if( s[k] == 'L' )
- {
- dp[i][j-1][k]+=div;
- dp[i][j-1][k]%=MOD;
- }
- else
- {
- dp[i+1][j][k]+=div;
- dp[i+1][j][k]%=MOD;
- }
- }
- }
- }
- ll sum[n+1] = {0};
- for(int i=1;i<=n;i++)
- sum[i] = (sum[i-1]+a[i-1])%MOD;
- ll res = 0;
- for(int i =1;i<=n;i++)
- {
- for(int j=i;j<=n;j++)
- {
- ll x = dp[i][j][K]*(sum[j]-sum[i-1]+MOD);
- x%=MOD;
- (res+=x)%=MOD;
- }
- }
- cout<<res<<endl;
- }
- int main(){
- function<ll int(ll int)> InverseUnderModulo = [&](ll int x)
- {
- if(x == 1)
- return 1ll;
- return (MOD - ((MOD/x) * InverseUnderModulo(MOD%x)) % MOD) % MOD;
- };
- for(int i=1;i<N;i++) inverse[i] = InverseUnderModulo(i);
- int tc=1;
- cin>>tc;
- while(tc--)
- solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment