codeforces 809C Find a car
codeforces 809C Find a car
题意
有个\(1e9*1e9\)的矩阵,行 \(x\) 从上到下递增,列 \(y\) 从左到右递增。每个格子有一个正值。\((x, y)\) 的值为 \((i, y)、(x, j) (1<=i<x, 1<=j<y)\) 中没有出现过的最小正整数。
\(1e4\)次询问,每次询问一个子矩阵中值小于等于\(k\)的数之和。

题解
1、\(val(x, y) = (x-1) XOR (y-1) + 1\)
类比尼姆博弈可证。
2、非递归形式的数位dp。\(cnt[p][i][j][k]、sum[p][i][j][k]\)。
代码
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define sz(x) (int)x.size()
#define de(x) cout<< #x<<" = "<<x<<endl
#define dd(x) cout<< #x<<" = "<<x<<" "
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
//------
const int mod=1e9+7, N=33;
ll sum[N][2][2][2], cnt[N][2][2][2];
void upd(ll &a,ll b) {
a=(a+b)%mod;
if(a<0) a+=mod;
}
ll solve(int x,int y,int n) {
if(x<0||y<0) return 0;
vi dx, dy, dn;
rep(i,0,N) {
dx.pb(x&1);
dy.pb(y&1);
dn.pb(n&1);
x>>=1;y>>=1;n>>=1;
}
reverse(dx.begin(), dx.end());
reverse(dy.begin(), dy.end());
reverse(dn.begin(), dn.end());
memset(sum,-1,sizeof(sum));
memset(cnt,-1,sizeof(cnt));
sum[0][1][1][1]=0;
cnt[0][1][1][1]=1;
rep(p,0,N-1) {
rep(i,0,2) rep(j,0,2) rep(k,0,2) if(~cnt[p][i][j][k]) {
rep(x,0,2) {
if(i&&(x>dx[p+1])) continue;
rep(y,0,2) {
if(j&&(y>dy[p+1])) continue;
int z=(x^y);
if(k&&(z>dn[p+1])) continue;
ll &_ = cnt[p+1][i&&(x==dx[p+1])][j&&(y==dy[p+1])][k&&(z==dn[p+1])];
ll &c = sum[p+1][i&&(x==dx[p+1])][j&&(y==dy[p+1])][k&&(z==dn[p+1])];
if(_==-1) _=0;
if(c==-1) c=0;
upd(_, cnt[p][i][j][k]);
upd(c, sum[p][i][j][k]);
upd(c, z*(1ll<<(N-1-p-1))*cnt[p][i][j][k]);
}
}
}
}
ll a1=0, a2=0;
rep(i,0,2) rep(j,0,2) rep(k,0,2) if(~cnt[N-1][i][j][k]) {
upd(a1, cnt[N-1][i][j][k]);
upd(a2, sum[N-1][i][j][k]);
}
return (a1+a2)%mod;
}
int main() {
int T;scanf("%d",&T);
while(T--) {
int a,b,c,d,n;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&n);
--a;--b;--c;--d;--n;
ll ans=0;
upd(ans,solve(c,d,n));
upd(ans,solve(a-1,b-1,n));
upd(ans,-solve(a-1,d,n));
upd(ans,-solve(c,b-1,n));
printf("%lld\n",ans);
}
return 0;
}
codeforces 809C Find a car的更多相关文章
- Codeforces 809C - Find a car(找性质)
Codeforces 题目传送门 & 洛谷题目传送门 首先拿到这类题第一步肯定要分析题目给出的矩阵有什么性质.稍微打个表即可发现题目要求的矩形是一个分形.形式化地说,该矩形可以通过以下方式生成 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
随机推荐
- java 初始化顺序问题
今天在<thinking in java>上面看了关于初始化问题,之前从来都没有深入考虑过,这次算是把它搞明白了,所以记录一下: 这个不是我看到的初始化顺序问题,在网上搜索的时候发现的,感 ...
- bug: 1.eclipse 中tomcat server 变灰色 2.build path 添加的jar不识别
1.网上百度的方案试过,没有作用. 最后删掉tomcat重新解压配置解决. 确保工程属性栏中,server正确才可加载tomcat. 猜测可能原因,tomcat在eclipse有时崩溃,一般做法是将s ...
- [转]log4net 发布到生产环境不写日志的解决方法--使用 NLog日志
本文转自:http://www.cnblogs.com/weiweictgu/p/5848805.html 1.升级到log4net的最新版 PM下执行 Install-Package log4net ...
- guava快速入门(三)
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support] ...
- [转] 常用的sql server规范
常见的字段类型选择 1.字符类型建议采用varchar/nvarchar数据类型 2.金额货币建议采用money数据类型 3.科学计数建议采用numeric数据类型 4.自增长标识建议采用bigi ...
- ASP.NET中让图片以二进制的形式存储在数据库中
今早有个网友问到我这问题,以前我都是直接在数据库中存文件名的,还没有试过存储整张图片到数据库中,上网搜索了一下,自己又测试了一番,代码如下:建立保存图片的表的SQL语句: USE [niunantes ...
- js只允许输入数字和两位小数
一.js只允许输入数字和两位小数 //只允许输入数字和两位小数 function clearNoNum(obj) { obj.value = obj.value.replace(/[^\d.]/g, ...
- 撩课-Python-每天5道面试题-第4天
一. for循环和while循环中的else代表什么意思? 当for循环和while循环顺利的遍历完成时, 就会执行else分支 如果循环过程中, 碰到continue, 只要没有打断循环, 就会继续 ...
- 搭建和启动javaWeb项目
首先,我们得配置服务器,我的demo采用tomcat 你只要找到tomcat的home路径就好了,后面会自动给你提示的
- Ubuntu16.04 下安装tomcat
有两种常用方法: 一.通过 apt-get 命令进行在线安装(会自动配置好环境变量和服务) 二.通过下载并解压 .tar.gz 包进行手动安装(需要手动配置环境变量) 一.通过 apt-get 命令进 ...