Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- //#include"testlib.h"
- using namespace std;
- typedef long long ll ;
- const int MX = 100009 , MXV = 52;
- int MODULO = 1e9 + 7;
- int dpLeft[MX][MXV] , dpRight[MX][MXV];
- int subAt[MX];
- ll answer;
- int T , arr[MX] , B , W;
- void solve(int l , int r){
- if(r - l < W) return;
- if(r - l == 0){
- if(arr[l] == 0)
- answer = (answer + 1)%MODULO;
- return;
- }
- int mid = (l + r)/2;
- //cout<<l<<' '<<r<<endl;
- solve(l , mid); solve(mid + 1 , r);
- for(int sum = 0 ; sum < B ; sum++)
- dpRight[mid][sum] = dpLeft[mid + 1][sum] = 0;
- dpRight[mid][0] = 1;
- for(int j = mid + 1 ; j <= r ; j++)
- for(int sum = 0 ; sum < B ; sum++)
- dpRight[j][sum] = (dpRight[j-1][sum] + dpRight[j-1][(sum - arr[j] + B)%B])%MODULO;
- dpLeft[mid+1][0] = 1;
- for(int j = mid ; j >= l ; j--)
- for(int sum = 0 ; sum < B ; sum++)
- dpLeft[j][sum] = (dpLeft[j+1][sum] + dpLeft[j+1][(sum - arr[j] + B)%B])%MODULO;
- long long theta = 0 , gamma = 0 , curadd = 0;
- for(int sum = 0 ; sum < B ; sum++){
- int other = (B - sum)%B;
- for(int j = l ; j + W <= r && j <= mid ; j++){
- theta = (dpLeft[j][sum] - dpLeft[j+1][sum] + MODULO)%MODULO;
- if(j + W - 1 >= mid) gamma = (dpRight[r][other] - dpRight[j + W - 1][other] + MODULO)%MODULO;
- else gamma = (dpRight[r][other] - dpRight[mid][other] + MODULO)%MODULO;
- curadd += (theta * gamma)%MODULO;
- }
- }
- answer += curadd;
- answer %= MODULO;
- }
- int n;
- int main(){
- //freopen("in.in","r",stdin);
- //freopen("solout.out","w",stdout);
- //ios::sync_with_stdio(false);
- //cin.tie(0);
- cin>>T;
- while(T--){
- cin>>n>>B>>W;
- answer = 0;
- for(int j = 1 ; j <= n ; j++)
- scanf("%d",&arr[j]);
- solve(1,n);
- cout<<answer<<endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement