经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
牛客提高R5 A.同余方程
来源:cnblogs  作者:自为风月马前卒  时间:2018/10/17 9:07:03  对本文有异议

题意

题目链接

Sol

\(solve(x, y)\)表示\(i \in [0, x], j \in [0, y]\)满足题目要求的方案数

首先容斥一下,\(ans = solve(r_1, r_2) - solve(l_1 - 1, r_2) - solve(l_2 - 1, r_1) + solve(l_1 -1, l_2 - 1)\)

然后按照套路按位拆分,这里拆的时候是直接对\(x, y\)进行拆分

这样就把问题转换成了看起来似乎简单一些的问题

假设拆完后的数是

110011101
1011

我们只要对于任意一对为1的位,求出小于该位的所有合法解即可

比如\(i = 3, j = 1\)我们要计算的就是\([110010000, 110010111]\)\([1000, 1001]\)内的合法解

两种都可以写成\([v, v + 2^k]\)的性质

先考虑一种简单的情况,即\(v = 0\)

假设\(i > j\),那么\(\forall z = x \oplus y \leqslant 2^i\), 对于任意的\(x \leqslant 2^j\),都会有唯一的\(y\)与之对应

那么我们只要数出\([0, 2^i]\)\(\% M == 0\)的数的个数,再乘上\(2^j\)即可

存在\(a[i]\)的限制实际上是一样的。

但是这样统计到的实际上是开区间的信息,只要在右端点处+1即可

  1. #include<iostream>
  2. #include<algorithm>
  3. #define LL long long
  4. using namespace std;
  5. const LL mod = 998244353;
  6. LL l1, r1, l2, r2, M;
  7. LL add(LL x, LL y) {
  8. return (x + y >= mod) ? (x + y - mod) : (x + y);
  9. }
  10. LL calc(LL l, LL r) {
  11. if(l == 0) return ((r / M) + 1) % mod;
  12. return (r / M - (l - 1) / M) % mod;
  13. }
  14. LL solve(LL X, LL Y) {
  15. LL ans = 0;
  16. for(LL i = 0, p1 = X; p1; i++, p1 >>= 1) {
  17. for(LL j = 0, p2 = Y; p2; j++, p2 >>= 1) {
  18. if((p1 & 1) && (p2 & 1)) {
  19. LL x = i, y = j; if(x < y) swap(x, y);
  20. LL ll = ((((p1 ^ 1) << i) ^ ((p2 ^ 1) << j)) >> x) << x;
  21. ans = add(ans, (1ll << y) % mod * calc(ll, ll + (1ll << x) - 1) % mod);
  22. //cout << ans << endl;
  23. }
  24. }
  25. }
  26. // cout << ans << endl;
  27. return ans;
  28. }
  29. int main() {
  30. cin >> l1 >> r1 >> l2 >> r2 >> M;
  31. cout << (solve(r1 + 1, r2 + 1) - solve(l1, r2 + 1) + mod - solve(r1 + 1, l2) + mod + solve(l1, l2) + mod) % mod;
  32. return 0;
  33. }
  34. /*
  35. 1 1 1 1 1
  36. */
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号