区间不好做,但是我们可以转化成前缀来做。转化为前缀之后之后就是二维前缀和。

但是我还是不怎么会做。所以只能去看吉老师的题解 (确定写的那么简单真的是题解???)。

我们要求模一个数余0,就等于找它的倍数。找它的倍数自然只要知道区间就可以了。

题解上面说:如果\(r1=2^n\),\(r2=2^m\),不妨设 \(n<=m\),那么结果一定在区间 \([0,2^n)\)中,而 且每一个值出现了 \(2^m\) 次

这是很显然的,因为按照异或的运算法则来讲,不可能会有比r1最高位1还高的位出现。而且考虑在二进制下,还有多种不同的方式可以凑成这个数。

之后我们考虑更一般的情况。

我们把高位确定下来,之后摆放低位。两两之间统计答案。

怎么理解呢,就是先把最高位的1确定下来,然后后面显然1就可以随便放了(反正使得当前位1变成0,后面(比它小的)的所有数都可以达到了)。我们考虑遍历枚举的两个边界的最高位1的位数,然后计算这种组合能够达到的范围(啊啊啊语文能力又下线了。。。怎么办。。大家看一下代码???),知道范围之后就容易能够知道有多少个所求数的倍数了。之后按照上面解释的,我们可以统计出有多少种不同的x,y组合方式达到这个异或值。

因为感觉自己说的很不清楚,所以代码里加了一点注释qwq。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #define mod 998244353
  6. #define ll long long
  7. using namespace std;
  8. ll kkk,ans,a,b,c,d;
  9. ll calc(ll a,ll b){
  10. ll ansans=0;
  11. for(int i=0;i<=63;++i)
  12. {
  13. //因为在long long范围内,所以遍历到63
  14. if(((a>>i)&1)==0) continue;
  15. //如果该位不是1就跳过
  16. for(int j=0;j<=63;++j)
  17. {
  18. if(((b>>j)&1)==0) continue;
  19. //同上
  20. ll l=((a-(1ll<<i))^(b-(1ll<<j)))&(~((1ll<<max(i,j))-1));
  21. //因为我们已经确定max(i,j)为最高位1了
  22. //所以前面的值就不变了,直接异或就行
  23. //后面的max(i,j)位经过处理全变成0(与操作和后面的东西就是这个用)
  24. //&(~((1<<n)-1))表示将后面的n位全部变成0
  25. ll r=l+(1ll<<max(i,j))-1;
  26. //因为是左闭右开区间
  27. ll cnt=(r/kkk)-l/kkk+(l%kkk==0);
  28. //注意左闭,所以如果正好是倍数的话还是要加上1
  29. tmp%=mod;
  30. ansans=(ansans+(cnt*((1LL<<min(i,j))%mod))%mod)%mod;
  31. //注意及时取模qwq
  32. //其实像我这样写不好,最好分步写,避免中间没有取模爆long long
  33. //哦,还要注意左移右移的运算级很低,所以即使加括号
  34. }
  35. }
  36. return ansans;
  37. }
  38. int main()
  39. {
  40. freopen("ce.in","r",stdin);
  41. scanf("%lld %lld %lld %lld %lld",&a,&b,&c,&d,&kkk);
  42. ll ans=calc(b+1,d+1);
  43. ans=(ans+mod-calc(c,b+1))%mod;
  44. ans=(ans+mod-calc(a,d+1))%mod;
  45. ans=(ans+calc(a,c))%mod;
  46. //类比二维前缀和
  47. printf("%lld\n",ans%mod);
  48. return 0;
  49. }

牛客网提高组模拟赛第五场 T1同余方程(异或)(位运算)的更多相关文章

  1. nowcoder(牛客网)提高组模拟赛第四场 解题报告

    T1 动态点分治 就是模拟..... 但是没有过!! 看了题解之后发现.... 坑点:有可能 \(x<=r\),但是

  2. 牛客网提高组模拟赛第七场 T3 洞穴(附bitset介绍)

    就是DP. 我们可以很简单的想到要枚举中间点,进行边数的转移. 但是因为边长数据范围很大,所以我们考虑log的倍增. 状态设计为\(dp[i][j][k]\),为从节点\(i\)走\(2^k\)步能否 ...

  3. 牛客网提高组模拟赛第七场 T2 随机生成树

    其实看懂题就很水啦qwq,就是求\(1-N\)的约数啦. 暴力求的话时间复杂度是\(O(NlogN)\)的,其实正解是枚举每个数的倍数......这样的时间复杂度是\(\frac{N}{1}+\fra ...

  4. nowcoder(牛客网)提高组模拟赛第一场 解题报告

    T1 中位数(二分) 这个题是一个二分(听说是上周atcoder beginner contest的D题???) 我们可以开一个数组b存a,sort然后二分b进行check(从后往前直接遍历check ...

  5. nowcoder(牛客网)普及组模拟赛第一场 解题报告

    蒟蒻我可能考了一场假试 T1 绩点 这题没什么好说的,应该是只要会语言的就会做. T2 巨大的棋盘 一个模拟题吧qwq,但是要注意取模的时候先加上n或者m再取模,要不然会错的. #include< ...

  6. 计蒜客NOIP2017提高组模拟赛(五)day1-展览

    传送门 发现这题选或不选对状态的优劣程度不会产生影响,如果已经确定了两个数a和b,那么最优的首项和公比也都是唯一确定的, 与对于后面的数x,加进去也好不加进去也好,首项和公比依旧是原来的 于是我们用尺 ...

  7. 计蒜客NOIP2017提高组模拟赛(五)day1-机智的 AmyZhi

    传送门 很水的题目啦QAQ #include<cstdio> #include<cstdlib> #include<algorithm> #include<c ...

  8. 计蒜客NOIP2017提高组模拟赛(五)day2-蚂蚁搬家

    传送门 这题可以用线段树来维护 #include<cstdio> #include<cstdlib> #include<algorithm> #include< ...

  9. 计蒜客NOIP2017提高组模拟赛(五)day2-成绩统计

    传送门 用hash,因为map的复杂度可能在这题中因为多一个log卡掉,但是hash不会 可能因为这个生成的随机数有循环的情况,不是完全均匀的 而且这题hash表的长度也可以开的很大 #include ...

随机推荐

  1. 运动函数封装(js)

    // 运动函数 function starMove(obj,json,fnEnd){ clearInterval(obj.timer); obj.timer  = setInterval(functi ...

  2. HttpClient由Client客户端上传File文件流至Server服务端

    客户端方法 public static void main(String[] args) { File file=new File("E:\\lucene\\rev\\全年平台受理量.doc ...

  3. nyoj27-水池数目 (求连通块数目)【dfs】

    http://acm.nyist.net/JudgeOnline/problem.php?pid=27 水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 南阳 ...

  4. coding创建项目

    在本地,使用git 需要创建一个pom.xml文件,就可以导入到工作空间了! 在需要项目工作空间里,依次使用git命令执行 mkdir test  //创建文件夹,项目名称cd test   //切换 ...

  5. redis 常用方法整理

    1.进入redis redis-cli -p -h 192.168.0.100 -a q9pCeAEMAWEL 2.查询keys keys activity_mobile_* 3.赋值.查值.删除 s ...

  6. if UNITY_EDITOR这个判断常用,还有哪个常用捏?

    #if DEVELOPMENT_BUILD || UNITY_EDITOR DEVELOPMENT_BUILD表示开发版的意思,会在程序右下角显示 Development Build 我们可以根据这个 ...

  7. 基于HttpRunner的接口自动化测试平台HttpRunnerManager(二)

    https://github.com/HttpRunner/HttpRunnerManager HttpRunnerManager Design Philosophy 基于HttpRunner的接口自 ...

  8. Partial Functions(偏函数)

    如果你想定义一个函数,而让它只接受和处理其参数定义域范围内的子集,对于这个参数范围外的参数则抛出异常,这样的函数就是偏函数(顾名思异就是这个函数只处理传入来的部分参数). 偏函数是个特质其的类型为Pa ...

  9. btrfs的精简总结版

    Btrfs 也有一个重要的缺点,当 BTree 中某个节点出现错误时,文件系统将失去该节点之下的所有的文件信息.而 ext2/3 却避免了这种被称为”错误扩散”的问题. 扩展性:extent.B-Tr ...

  10. vscode安装设置go

    vscode安装设置go vscode安装go配置 1.下载最新的vscode: https://code.visualstudio.com/docs/?dv=win 2.下载go: https:// ...