传送门

luogu

其实这题的某个位置\((i,j)\)的数是\((i-1)\mathrm{xor}(j-1)+1\)

首先一个矩形的答案可以拆成\((x2,y2)-(x1-1,y2)-(x2,y1-1)+(x1-1,y1-1)\)

然后这里有三个限制\(i\le x,j\le y,i\ \mathrm{xor}\ j\le k\),可以考虑dp之类的.我们从高位往低位做,设\(f_{i,j,k,l}\)表示第\(i\)位,现在的\(i,j,i\ \mathrm{xor}\ j\)是否达到上界的权值和,转移枚举下一位是什么,如果当前这个数在上界,可以让他继续卡着上界,也可以不卡上界;否则可以随便放

注意那个\(+1\),我们另外设\(g_{i,j,k,l}\)表示方案数,答案为所有权值和+方案数

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define db double
  4. #define il inline
  5. using namespace std;
  6. const int N=3e5+10,mod=1e9+7;
  7. il LL rd()
  8. {
  9. LL x=0,w=1;char ch=0;
  10. while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
  11. while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
  12. return x*w;
  13. }
  14. int f[2][2][2][2],g[2][2][2][2];
  15. void ad(int &x,int y){x+=y,x-=(x>=mod)?mod:0;}
  16. LL sov(int mx,int my,int mk)
  17. {
  18. if(mx<0||my<0) return 0;
  19. memset(f,0,sizeof(f)),memset(g,0,sizeof(g));
  20. int nw=1,la=0;
  21. g[0][1][1][1]=1;
  22. for(int i=30;~i;--i)
  23. {
  24. int x=mx>>i&1,y=my>>i&1,kk=mk>>i&1;
  25. for(int j=0;j<=1;++j)
  26. for(int k=0;k<=1;++k)
  27. for(int l=0;l<=1;++l)
  28. {
  29. if(!g[la][j][k][l]) continue;
  30. for(int xx=0;xx<=(x|(!j));++xx)
  31. for(int yy=0;yy<=(y|(!k));++yy)
  32. if((xx^yy)<=kk||!l)
  33. {
  34. ad(f[nw][j&(xx==x)][k&(yy==y)][l&((xx^yy)==kk)],(f[la][j][k][l]+1ll*g[la][j][k][l]*((xx^yy)<<i)%mod)%mod);
  35. ad(g[nw][j&(xx==x)][k&(yy==y)][l&((xx^yy)==kk)],g[la][j][k][l]);
  36. }
  37. f[la][j][k][l]=g[la][j][k][l]=0;
  38. }
  39. nw=!nw,la=!la;
  40. }
  41. int ans=0;
  42. for(int j=0;j<=1;++j)
  43. for(int k=0;k<=1;++k)
  44. for(int l=0;l<=1;++l)
  45. ad(ans,(f[la][j][k][l]+g[la][j][k][l])%mod);
  46. return ans;
  47. }
  48. int main()
  49. {
  50. //aha
  51. int T=rd();
  52. while(T--)
  53. {
  54. int ax=rd()-1,ay=rd()-1,bx=rd()-1,by=rd()-1,k=rd()-1;
  55. printf("%lld\n",(sov(bx,by,k)-sov(ax-1,by,k)-sov(bx,ay-1,k)+sov(ax-1,ay-1,k)+mod+mod)%mod);
  56. }
  57. return 0;
  58. }

CF809C Find a car的更多相关文章

  1. 【CF809C】Find a car(动态规划)

    [CF809C]Find a car(动态规划) 题面 洛谷 CF 有一个无穷大的矩阵,第\(i\)行第\(j\)列的数是\((i-1)xor(j-1)+1\),\(q\)次询问,每次询问一个矩形内数 ...

  2. 洛谷CF809C Find a car(数位DP)

    洛谷题目传送门 通过瞪眼法发现,\(a_{i,j}=(i-1)\text{ xor }(j-1)+1\). 二维差分一下,我们只要能求\(\sum\limits_{i=0}^x\sum\limits_ ...

  3. $CF809C\ Find\ a\ car$ 数位$dp$

    正解:数位$dp$ 解题报告: 传送门! 然后因为没有翻译所以先放个翻译$QAQ$ 有一个无穷大的矩阵,第$i$行第$j$列的数是$(i-1)\ xor\ (j-1)+1$,有$q$次询问,每次询问一 ...

  4. CF809C(找规律+数位DP)

    老年选手需要多写一些思维题qwq. 通过打表很容易发现对于(i,j),值为(i-1)^(j-1)+1,然后本题就没了qwq. 矩阵差分还是很容易想到的,容斥成四个矩阵. 然后看到异或很容易想到三件事: ...

随机推荐

  1. String:字符串常量池

    String:字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池: 字 ...

  2. Django 模板 继承和包含

    ##### 母版 ##### 这里是头部 {% block body-content %}{% endblock %} 这里是底部 #### 继承模板 ### {% extends 'layout.h ...

  3. smartProgram学习笔记

    背景:转正前要完成这样一个编程课的学习.平时写代码只是完成基本的功能,没有养成良好的习惯,感觉这样的课程还是要好好学习下,要不真是不知道什么叫写代码. Week1 为什么要写好代码? 因为平时读:写代 ...

  4. 象棋start

    这篇文章其实谈的不是象棋开局,更谈不上开局技巧,举个例子:第一步走炮二平五,也即是中炮局,但中炮局可以根据对手的应对着法演变成很多,比如:五七炮对屏风马,五六炮对屏风马,顺炮局,以及雷公炮等等,这些才 ...

  5. prototype 与 proto的关系是什么:

    __proto__是什么? 我们在这里简单地说下.每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去__proto_ ...

  6. HDU3974 Assign the task

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. Transactional 事务

    1.事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚 其实像第一种try catch这种把整个包裹起来,这种业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中 ...

  8. Mac idea中git igenore设置

  9. SSH框架调用scrapy爬虫

    毕设刚答辩完毕,不用担心查重了,所以补一篇毕设的内容. 毕设是图片搜索网站,使用python爬虫获取图片资源,再由javaweb管理使用图片的信息和图片,大部分实现起来十分简单,也不好意思炫耀.但是有 ...

  10. BZOJ3531 树剖 + 动态开点线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=3531 首先这题意要求树链上的最大值以及求和,其树链剖分的做法已经昭然若揭 问题在于这次的信息有宗教 ...