Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- // #define sieve_ul int(1e6)
- #define endl "\n"
- #define mp(x,y) make_pair(x,y)
- #define pb(x) push_back(x)
- // ll sieve_arr[sieve_ul + 10];
- // vector<ll> primes;
- ll fastexp(ll b, ll e)
- {
- ll ans = 1;
- ll lpow = b;
- while(e)
- {
- if(e & 1)
- ans *= lpow;
- lpow *= lpow;
- e = (e >> 1);
- }
- return ans;
- }
- bool isprime(ll x)
- {
- for(ll i=2; i <= sqrt(x); i++)
- if(x%i == 0)
- return false;
- return true;
- }
- // void sieve()
- // {
- // primes.clear();
- // memset(sieve_arr, -1, sizeof(sieve_arr));
- // for(int i=2; i<= sieve_ul; i++)
- // {
- // if(sieve_arr[i] == -1)
- // for(int j=2; j*i <= sieve_ul; j++)
- // sieve_arr[i*j] = 1;
- // }
- // for(int i=2; i<= sieve_ul; i++)
- // if(sieve_arr[i] == -1)
- // primes.push_back(i);
- // }
- void solve()
- {
- ll n, x, ps=0;
- cin>>n>>x;
- ll arr[n+1];
- for(ll lv=1;lv<=n;lv++)
- cin>>arr[lv];
- ll presum[n+1];
- memset(presum, 0, sizeof(presum));
- for(ll lv=1;lv<=n;lv++)
- {
- ps += arr[lv];
- presum[lv] = ps;
- }
- ll ans = 0;
- unordered_map<ll,ll> um;
- vector<ll> dimv;
- dimv.clear();
- for(ll dim=1; dim*dim <=x;dim++)
- if(x%dim == 0)
- {
- dimv.pb(dim);
- if(fastexp(dim, 2) != x)
- dimv.pb(x/dim);
- }
- for(auto dim:dimv)
- {
- if(dim > n)
- continue;
- // cout<<"\ndim "<<dim<<endl;
- um.clear();
- for(ll di = dim; di <= n; di++)
- {
- ll ls = presum[di] - presum[di - dim];
- if(ls >= x/dim)
- continue;
- um[ls]++;
- }
- for(auto it=um.begin(); it != um.end(); it++)
- {
- if(it->second)
- {
- ans += (it->second)*um[x/dim - it->first];
- }
- }
- }
- cout<<ans;
- }
- int main()
- {
- ll tc;
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- cout.tie(NULL);
- cin>>tc;
- while(tc--)
- {
- solve();
- cout<<endl;
- }
- }
Add Comment
Please, Sign In to add comment