fork download
  1. #include<iostream>
  2. #include <bits/stdc++.h>
  3. #define ll long long
  4. #define ld long double
  5. #define IO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  6. using namespace std;
  7. vector<int>v1[50][50], v2[50][50];
  8. int x, y,m, k, t;
  9. ll ans ;
  10. void solve(int i, int cnt, int mx, int val, vector<int>v[][50])
  11. {
  12. if(i==mx)
  13. {
  14. v[cnt][mx-cnt].push_back(val);
  15. return ;
  16. }
  17. solve(i+1,cnt+1,mx,(2*val+1)%m, v);
  18. solve(i+1,cnt,mx,(2*val)%m, v);
  19. }
  20. int main()
  21. {
  22. IO
  23. freopen("zeros.in", "r", stdin);
  24. cin>>t;
  25. while(t--)
  26. {
  27. ans=0;
  28. for(int i=0; i<=45; i++)
  29. for(int j=0; j<=45; j++)
  30. v1[i][j].clear(), v2[i][j].clear();
  31. cin>>x>>y>>m>>k;
  32. int total=x+y;
  33. int f=(total+1)/2;
  34. solve(1,1,f,1,v1);
  35. solve(0,0,total-f,0,v2);
  36. ll lft=total-f;
  37. for(int i=0; i<=x; i++)
  38. for(int j=0; j<=y; j++)
  39. sort(v2[i][j].begin(),v2[i][j].end());
  40. for(int i=1; i<=x; i++)
  41. for(int j=0; j<=y; j++)
  42. for(auto cur : v1[i][j])
  43. {
  44. ll val=cur*(1LL<<lft);
  45. val%=m;
  46.  
  47. ans+=
  48. lower_bound(v2[x-i][y-j].begin(),v2[x-i][y-j].end(),m-val)-
  49. lower_bound(v2[x-i][y-j].begin(),v2[x-i][y-j].end(),k-val);
  50.  
  51. ans+=v2[x-i][y-j].size()-
  52. ( lower_bound(v2[x-i][y-j].begin(),v2[x-i][y-j].end(),k+m-val)-v2[x-i][y-j].begin());
  53.  
  54.  
  55. }
  56. cout<<ans<<endl;
  57. }
  58. }
  59.  
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Standard output is empty