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个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
随机推荐
- DDD学习笔记(一)
最近开始筹备一个电商项目. 其实是公司的老本行了. 但今年公司希望在做项目的同时, 沉淀出一套针对电商的基础产品. 这样可以提高新项目的开发效率, 减少重复劳动. 那现如今, DDD(领域驱动设计)应 ...
- iOS开源项目周报0216
由OpenDigg 出品的iOS开源项目周报第八期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等.Animated ...
- [转]asp.net权限认证:摘要认证(digest authentication)
本文转自:http://www.cnblogs.com/lanxiaoke/p/6357501.html 摘要认证简单介绍 摘要认证是对基本认证的改进,即是用摘要代替账户密码,从而防止明文传输中账户密 ...
- n后问题
Description 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇 ...
- linux中find与rm实现查找并删除文件
find命令: find . -name '*.log' #查找当前目录下的log文件 查找并删除: find . -name '*.log' -type f -print -exec rm -rf ...
- nodejs文件上传组件multer使用
多图上传,发送端: var express = require('express') var rp = require('request-promise') var fs = require(&quo ...
- Node.js 学习笔记(一)--------- Node.js的认识和Linux部署
Node.js 一.Node.js 简介 简单的说 Node.js 就是运行在服务端的可以解析并运行 JavaScript 脚本的软件. Node.js 是一个基于Chrome JavaScript ...
- Java设计模式—状态模式
状态模式又是一个比较难的设计模式 定义如下: 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类. 个人理解:通俗的讲,状态模式就是状态的改变引起了行为的改变,但是,我们只能看到行为的 ...
- Ubuntu 安装 PhpMyAdmin 图文教程
Ubuntu 安装 PhpMyAdmin 管理 MySQL 数据库 PhpMyAdmin 是一个用 PHP 编写的软件工具,可以通过 web方式控制和操作 MySQL 数据库.通过 phpMyAdmi ...
- vue2.0中的计算属性
计算属性是一个很邪门的东西,只要在它的函数里引用了data中的某个属性,当这个属性发生变化的时候,函数仿佛可以嗅探到这个变化,并自动重新执行. 上代码会源源不断的打印出a的值.如果希望b依赖data中 ...