[SDOI2016]储能表
Description
有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号。每个格子都储存着能量。最初,第 i 行第 j 列的格子储存着 (i xor j) 点能量。所以,整个表格储存的总能量是,
.png)
.png)
Input
第一行一个整数 T,表示数据组数。接下来 T 行,每行四个整数 n、m、k、p。
Output
共 T 行,每行一个数,表示总能量对 p 取模后的结果
Sample Input
2 2 0 100
3 3 0 100
3 3 1 100
Sample Output
12
6
HINT
T=5000,n≤10^18,m≤10^18,k≤10^18,p≤10^9
令$f[i][a][b][c]和g[i][a][b][c]$表示第i位,表示x后i-1位是否等于n,y后i-1位是否等于m,x^y后i-1位是否等于k的异或和以及方案数
如果a==1,且第i位大于n的第i位,那么超过上界,舍去
b同理
c比较特殊,如果c==1,如果第i为小于k的第i位,那么异或结果必定小于k,答案为0,舍去
$g[i][a][b][c]+=g[i-1][aa][bb][cc]$
$f[i][a][b][c]+=f[i-1][aa][bb][cc]+[第i位异或值为1]*2^{i}*g[i-1][aa][bb][cc]$
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long lol;
lol f[][][][],g[][][][],n,m,Mod,k,pw[],t1,t2,S,t3;
void dfs(lol x,int a,int b,int c)
{lol i,j;
if (f[x][a][b][c]!=-||g[x][a][b][c]!=-) return;
g[x][a][b][c]=f[x][a][b][c]=;
if (x==)
{
f[][a][b][c]=;
g[][a][b][c]=;
return;
}
for (i=;i<=;i++)
{
int xx=(n>>x-)&;
int yy=(m>>x-)&;
int zz=(k>>x-)&;
if (a&&i>xx) continue;
for (j=;j<=;j++)
{
if (b&&j>yy) continue;
lol p=i^j;
if (c&&p<zz) continue;
int aa=a&(xx==i);
int bb=b&(yy==j);
int cc=c&(zz==p);
dfs(x-,aa,bb,cc);
g[x][a][b][c]=(g[x][a][b][c]+g[x-][aa][bb][cc])%Mod;
f[x][a][b][c]=((f[x][a][b][c]+g[x-][aa][bb][cc]*p*(pw[x-]%Mod)%Mod)%Mod+f[x-][aa][bb][cc])%Mod;
}
}
}
lol solve()
{
memset(f,-,sizeof(f));
memset(g,-,sizeof(g));
t1=;S=n;
if (n==&&m==) return ;
while (S)
{
S>>=;
t1++;
}
t2=;S=m;
while (S)
{
S>>=;
t2++;
}
t3=;S=k;
while (S)
{
S>>=;
t3++;
}
t1=max(t1,max(t2,t3));
dfs(t1,,,);
return f[t1][][][]-(k%Mod)*g[t1][][][]%Mod;
}
int main()
{int T,i;
cin>>T;
pw[]=;
for (i=;i<=;i++)
pw[i]=pw[i-]*;
while (T--)
{
cin>>n>>m>>k>>Mod;
n--;m--;
printf("%lld\n",(solve()+Mod)%Mod);
}
}
[SDOI2016]储能表的更多相关文章
- BZOJ 4513: [Sdoi2016]储能表 [数位DP !]
4513: [Sdoi2016]储能表 题意:求\[ \sum_{i=0}^{n-1}\sum_{j=0}^{m-1} max((i\oplus j)-k,0) \] 写出来好开心啊...虽然思路不完 ...
- 4513: [Sdoi2016]储能表
4513: [Sdoi2016]储能表 链接 分析: 数位dp. 横坐标和纵坐标一起数位dp,分别记录当前横纵坐标中这一位是否受n或m的限制,在记录一维表示当前是否已经大于k了. 然后需要两个数组记录 ...
- 【LG4067】[SDOI2016]储能表
[LG4067][SDOI2016]储能表 题面 洛谷 题解 这种$n$.$m$出奇的大的题目一看就是数位$dp$啦 其实就是用一下数位$dp$的套路 设$f[o][n][m][k]$表示当前做到第$ ...
- 【BZOJ4513】[Sdoi2016]储能表 数位DP
[BZOJ4513][Sdoi2016]储能表 Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 ...
- BZOJ4513 SDOI2016 储能表 记忆化搜索(动态规划)
题意: 题面中文,不予翻译:SDOI2016储能表 分析: 据说有大爷用一些奇怪的方法切掉了这道题%%%%% 这里用的是大众方法——动态规划. 其实这是一道类似于二进制数位dp的动态规划题,(但是实际 ...
- BZOJ4513: [Sdoi2016]储能表
Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 j 列的格子储存着 (i xor j) 点能量. ...
- BZOJ.4513.[SDOI2016]储能表(数位DP)
BZOJ 洛谷 切了一道简单的数位DP,终于有些没白做题的感觉了...(然而mjt更强没做过这类的题也切了orz) 看部分分,如果\(k=0\),就是求\(\sum_{i=0}^n\sum_{j=0} ...
- [SDOI2016]储能表——数位DP
挺隐蔽的数位DP.少见 其实减到0不减了挺难处理.....然后就懵了. 其实换个思路: xor小于k的哪些都没了, 只要留下(i^j)大于等于k的那些数的和以及个数, 和-个数*k就是答案 数位DP即 ...
- 4513: [Sdoi2016]储能表 数位DP
国际惯例的题面: 听说这题的正解是找什么规律,数位DP是暴力......好的,我就写暴力了QAQ.我们令f[i][la][lb][lc]表示二进制从高到低考虑位数为i(最低位为1),是否顶n上界,是否 ...
随机推荐
- vue计算属性详解——小白速会
一.什么是计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example"> ...
- OO前三次作业总结
一.第一次作业 1.程序设计分析  图1 第一次作业类图 
这个是百度官方的文档 https://ai.baidu.com/docs#/OCR-API/top 通用的文字识别,如果是其他的含生僻字/含位置信息的版本,请参考官方的文档,只 ...
- MMA8451重力加速度计通过写内部校准寄存器进行校准
|版权声明:本文为博主原创文章,未经博主允许不得转载. AN4069应用笔记中提到MMA8451的三个轴重力校准有两种方法, 第一种方法是简易校准,将贴有MMA8451的设备整体,Z轴正面朝上放在校准 ...
- python hashlib、hmac模块
一.hashlib模块 import hashlib m = hashlib.md5() m.update(b"Hello") print(m.hexdigest()) m.upd ...
- B树和B+树的插入、删除图文详解
简介:本文主要介绍了B树和B+树的插入.删除操作.写这篇博客的目的是发现没有相关博客以举例的方式详细介绍B+树的相关操作,由于自身对某些细节也感到很迷惑,通过查阅相关资料,对B+树的操作有所顿悟,写下 ...
- Android 扩大 View 的点击区域
有时候,按照视觉图做出来效果后,发现点击区域过小,不好点击,用户体验肯定不好.扩大视图,就会导致整个视觉图变得不好看.那么有没有什么办法在不改变视图大小的前提下扩大点击区域呢? 答案是有! 能够解决这 ...
- istio入门(02)istio的架构和概念
Istio从逻辑上可以分为数据平面和控制平面: 数据平面主要由一系列的智能代理(Envoy)组成,管理微服务之间的网络通信 控制平面负责管理和配置这些智能代理,并动态执行策略 主要由以下组件构成 En ...
- 19届华为实习生笔试之判断iPv6地址类型
题二: 答案: #coding=utf-8 import re,sys str = sys.stdin.readline().strip() def regex(str): result = &quo ...
- RxJava系列5(组合操作符)
RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...