Guest User

Untitled

a guest
Mar 21st, 2018
411
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.64 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const long long mo=1e9+7;
  6.  
  7. int n,m;
  8. long long mod;
  9. int q;
  10.  
  11. long long gcd(long long x, long long y)
  12. {
  13. if (x<0) x*=-1;
  14. if (y<0) y*=-1;
  15. if (x==0 || y==0) return max(x,y);
  16. if (x%y==0) return y;
  17. return gcd(y,x%y);
  18. }
  19.  
  20. pair<long long,pair<int,int> > calc(int x, int y)
  21. {
  22. long long tot=0;
  23.  
  24. //kratim po y
  25. tot=x*(y/mod);
  26. tot%=mo;
  27. y%=mod;
  28.  
  29. // kratim po x
  30. tot+=y*(x/mod);
  31. tot%=mo;
  32. x%=mod;// sada x<mod && y<mod
  33. return {tot,{x,y}};
  34. }
  35.  
  36. long long mul(long long n, long long x, long long k)
  37. {
  38. long long first=k*n;
  39. first%=mo;
  40. first*=x;
  41. first%=mo;
  42.  
  43. return first;
  44. }
  45.  
  46. long long sumDOWN(long long n, long long x, long long k)//sum (n+i) *(x-i) (i=0...k-1) po modulu 10^9+7
  47. {
  48. long long ans=0;
  49. long long first=mul(n,x,k);
  50.  
  51. long long p=6;
  52.  
  53. long long second=(k-1)/gcd(k-1,p);
  54. p/=gcd(k-1,p);
  55.  
  56. long long third=k/gcd(k,p);
  57. p/=gcd(k,p);
  58.  
  59. long long fourth=(3*n-3*x+2*k-1);
  60. long long fifth=fourth;
  61. fourth=fifth/gcd(fifth,p);
  62. p/=gcd(fifth,p);//sada je p sigurno 1
  63.  
  64. long long sixth=mul(second,third,fourth);
  65.  
  66. ans=(first-sixth+mo)%mo;
  67.  
  68. return ans;
  69. }
  70.  
  71. long long sumUP(long long n, long long x, long long k) //sum (n+i)*(x+i) (i=0...k-1) po modulu 10^9+7
  72. {
  73. long long ans=0;
  74.  
  75. long long first= mul(n,x,k);
  76.  
  77. long long p=6;
  78.  
  79. long long second=(k-1)/gcd(k-1,p);
  80. p/=gcd(k-1,p);
  81.  
  82. long long third=k/gcd(k,p);
  83. p/=gcd(k,p);
  84.  
  85. long long fourth=(3*n+3*x+2*k-1);
  86. long long fifth=fourth;
  87. fourth=fifth/gcd(fifth,p);
  88. p/=gcd(fifth,p);//sada je p sigurno 1
  89.  
  90. long long sixth=mul(second,third,fourth);
  91.  
  92. ans=(first+sixth)%mo;
  93.  
  94. return ans;
  95. }
  96.  
  97. long long sumLine(long long n, long long x, long long k) // sum (n+i)*x i=0...k-1 po modulu 10^9+7
  98. {
  99. long long ans=0;
  100.  
  101. long long first=mul(n,x,k);
  102.  
  103. long long second=k-1;
  104. long long third=k;
  105.  
  106. if (second%2==0) second/=2; else third/=2;
  107.  
  108. long long fourth=mul(second,third,x);
  109.  
  110. ans=(fourth+first)%mo;
  111.  
  112. return ans;
  113. }
  114. long long finish(int xl, int yl,int xr, int yr)
  115. {
  116. if (xl>xr || yl>yr) return 0;
  117. long long ans=0;
  118.  
  119. long long dx=(xr-xl)+1;
  120. long long dy=(yr-yl)+1;
  121. long long dz=min(dx,dy)-1;
  122.  
  123. long long currentTop=(xl+yl)%mod;
  124. long long rest=mod-currentTop;
  125.  
  126. if (rest>=dz)
  127. ans=sumUP(currentTop,1,dz);
  128. else
  129. {
  130. ans=sumUP(currentTop,1,rest);
  131. ans+=sumUP(0,rest+1, dz-rest);
  132. }
  133.  
  134. currentTop+=dz;
  135. currentTop%=mod;
  136. ans%=mo;
  137.  
  138. long long dp=max(dx,dy)-dz;
  139. rest=mod-currentTop;
  140.  
  141. if (rest>=dp)
  142. ans+=sumLine(currentTop,min(dx,dy),dp);
  143. else
  144. {
  145. ans+=sumLine(currentTop,min(dx,dy),rest);
  146. ans+=sumLine(0,min(dx,dy),dp-rest);
  147. }
  148.  
  149. currentTop+=dp;
  150. currentTop%=mod;
  151. ans%=mo;
  152.  
  153. rest=mod-currentTop;
  154.  
  155. if (rest>=dz)
  156. ans+=sumDOWN(currentTop,dz,dz);
  157. else
  158. {
  159. ans+=sumDOWN(currentTop,dz,rest);
  160. ans+=sumDOWN(0,dz-rest, dz-rest);
  161. }
  162.  
  163. ans%=mo;
  164.  
  165. return ans;
  166. }
  167. int main()
  168. {
  169. scanf("%d%d%lld",&n,&m,&mod);
  170. scanf("%d",&q);
  171.  
  172. long long val=(1ll*(mod-1)*mod)/2;
  173. val%=mo;
  174.  
  175. while(q--)
  176. {
  177. int xl,yl,xr,yr;
  178. scanf("%d%d%d%d",&xl,&yl,&xr,&yr);
  179. long long ans=0;
  180. pair<long long,pair<int,int> > rest = calc(xr-xl+1,yr-yl+1);
  181. ans=(val*rest.first)%mo;
  182. ans+=finish(xr-rest.second.first+1,yr-rest.second.second+1, xr, yr);
  183. ans%=mo;
  184. printf("%lld\n",ans);
  185. }
  186.  
  187. return 0;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment