Advertisement
Guest User

Untitled

a guest
Dec 24th, 2018
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 KB | None | 0 0
  1.     #include<bits/stdc++.h>
  2.     //#include"testlib.h"
  3.     using namespace std;
  4.     typedef long long ll ;
  5.     const int MX = 100009 , MXV = 52;
  6.      
  7.     int MODULO = 1e9 + 7;
  8.      
  9.     int dpLeft[MX][MXV] , dpRight[MX][MXV];
  10.      
  11.     int subAt[MX];
  12.      
  13.     ll answer;
  14.      
  15.     int T , arr[MX] , B , W;
  16.      
  17.      
  18.     void solve(int l , int r){
  19.         if(r - l < W) return;
  20.         if(r - l == 0){
  21.             if(arr[l] == 0)
  22.                 answer = (answer + 1)%MODULO;
  23.             return;
  24.         }
  25.         int mid = (l + r)/2;
  26.         //cout<<l<<' '<<r<<endl;
  27.         solve(l , mid); solve(mid + 1 , r);
  28.      
  29.         for(int sum = 0 ; sum < B ; sum++)
  30.             dpRight[mid][sum] = dpLeft[mid + 1][sum] = 0;
  31.      
  32.         dpRight[mid][0] = 1;
  33.      
  34.         for(int j = mid + 1 ; j <= r ; j++)
  35.             for(int sum = 0 ; sum < B ; sum++)
  36.                 dpRight[j][sum] = (dpRight[j-1][sum] + dpRight[j-1][(sum - arr[j] + B)%B])%MODULO;
  37.      
  38.         dpLeft[mid+1][0] = 1;
  39.      
  40.         for(int j = mid ; j >= l ; j--)
  41.             for(int sum = 0 ; sum < B ; sum++)
  42.                 dpLeft[j][sum] = (dpLeft[j+1][sum] + dpLeft[j+1][(sum - arr[j] + B)%B])%MODULO;
  43.      
  44.      
  45.         long long theta = 0 , gamma = 0 , curadd = 0;
  46.      
  47.         for(int sum = 0 ; sum < B ; sum++){
  48.             int other = (B - sum)%B;
  49.             for(int j = l ; j + W <= r && j <= mid ; j++){
  50.      
  51.                 theta = (dpLeft[j][sum] - dpLeft[j+1][sum] + MODULO)%MODULO;
  52.      
  53.                 if(j + W - 1 >= mid) gamma = (dpRight[r][other] - dpRight[j + W - 1][other] + MODULO)%MODULO;
  54.                 else gamma = (dpRight[r][other] - dpRight[mid][other] + MODULO)%MODULO;
  55.      
  56.                 curadd += (theta * gamma)%MODULO;
  57.             }
  58.         }
  59.      
  60.         answer += curadd;
  61.         answer %= MODULO;
  62.      
  63.     }
  64.      
  65.     int n;
  66.      
  67.     int main(){
  68.         //freopen("in.in","r",stdin);
  69.         //freopen("solout.out","w",stdout);
  70.             //ios::sync_with_stdio(false);
  71.     //cin.tie(0);
  72.         cin>>T;
  73.         while(T--){
  74.             cin>>n>>B>>W;
  75.             answer = 0;
  76.             for(int j = 1 ; j <= n ; j++)
  77.                 scanf("%d",&arr[j]);
  78.             solve(1,n);
  79.             cout<<answer<<endl;
  80.         }
  81.      
  82.      
  83.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement