如果n、m、k都是2的幂次方,答案非常好统计。于是容易想到数位dp,考虑每一位是否卡限制即可,即设f[i][0/1][0/1][0/1]为第i位是/否卡n、m、k的限制时,之前的位的总贡献;g[i][0/1][0/1][0/1]为第i位是/否卡n、m、k的限制时,之前的位的方案数。为了方便可以改为统计小于k的贡献再减去。

  莫名其妙的搞错了很多地方,简直调一年,不知道在干啥。

  人丑常数大,根本没办法。

  (突然发现以前大部分数位dp都是直接按位计数就搞出来了……这个题应该也行。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 64
ll read()
{
ll x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int T,p,f[N][][][],g[N][][][],a[N],b[N],c[N],q[N];
ll n,m,k;
void inc(int &x,int y,int p){x+=y;if (x>=p) x-=p;}
void calc(ll n,ll m,ll k,int p)
{
memset(f,,sizeof(f));memset(g,,sizeof(g));
int t=-;ll x=max(max(n,m),k);
while (x) t++,x>>=;
for (int i=;i<=t;i++) a[i]=(n&(1ll<<i))>;
for (int i=;i<=t;i++) b[i]=(m&(1ll<<i))>;
for (int i=;i<=t;i++) c[i]=(k&(1ll<<i))>;
g[t+][][][]=;
for (register int i=t;~i;i--)
for (register int x=;x<=;x++)
for (register int y=;y<=;y++)
for (register int z=;z<=;z++)
for (register int u=x;u<=;u++)
for (register int v=y;v<=;v++)
for (register int w=z;w<=;w++)
{
int t=(!w|c[i]&z)?(((!u|a[i]&x)&(!v|b[i]^y))+((!v|b[i]&y)&(!u|a[i]^x))):;
inc(f[i][x][y][z],1ll*q[i]*g[i+][u][v][w]%p*t%p,p);
if (!w|c[i]^z) t+=(((!u|a[i]&x)&(!v|b[i]&y))+((!u|a[i]^x)&(!v|b[i]^y)));
inc(f[i][x][y][z],1ll*f[i+][u][v][w]*t%p,p);
inc(g[i][x][y][z],1ll*g[i+][u][v][w]*t%p,p);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4513.in","r",stdin);
freopen("bzoj4513.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
T=read();
while (T--)
{
n=read()-,m=read()-,k=read(),p=read();
q[]=;for (int i=;i<=;i++) q[i]=(q[i-]<<)%p;
int ans=;
calc(n,m,max(n,m)<<,p);
for (int x=;x<=;x++)
for (int y=;y<=;y++)
for (int z=;z<=;z++)
inc(ans,f[][x][y][z],p),inc(ans,p-1ll*k%p*g[][x][y][z]%p,p);
calc(n,m,k,p);
for (int x=;x<=;x++)
for (int y=;y<=;y++)
for (int z=;z<=;z++)
inc(ans,p-f[][x][y][z],p),inc(ans,1ll*k%p*g[][x][y][z]%p,p);
cout<<ans<<endl;
}
return ;
}

BZOJ4513 SDOI2016储能表(数位dp)的更多相关文章

  1. BZOJ4513: [Sdoi2016]储能表(数位dp)

    题意 题目链接 Sol 一点思路都没有,只会暴力,没想到标算是数位dp??Orz 首先答案可以分成两部分来统计 设 \[ f_{i,j}= \begin{aligned} i\oplus j & ...

  2. [bzoj4513][SDOI2016]储能表——数位dp

    题目大意 求 \[\sum_{i = 0}^{n-1}\sum_{j=0}^{m-1} max((i\ xor\ j)\ -\ k,\ 0)\ mod\ p\] 题解 首先,开始并没有看出来这是数位d ...

  3. 【BZOJ4513】[Sdoi2016]储能表 数位DP

    [BZOJ4513][Sdoi2016]储能表 Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 ...

  4. BZOJ 4513: [Sdoi2016]储能表 [数位DP !]

    4513: [Sdoi2016]储能表 题意:求\[ \sum_{i=0}^{n-1}\sum_{j=0}^{m-1} max((i\oplus j)-k,0) \] 写出来好开心啊...虽然思路不完 ...

  5. BZOJ.4513.[SDOI2016]储能表(数位DP)

    BZOJ 洛谷 切了一道简单的数位DP,终于有些没白做题的感觉了...(然而mjt更强没做过这类的题也切了orz) 看部分分,如果\(k=0\),就是求\(\sum_{i=0}^n\sum_{j=0} ...

  6. [SDOI2016]储能表——数位DP

    挺隐蔽的数位DP.少见 其实减到0不减了挺难处理.....然后就懵了. 其实换个思路: xor小于k的哪些都没了, 只要留下(i^j)大于等于k的那些数的和以及个数, 和-个数*k就是答案 数位DP即 ...

  7. 4513: [Sdoi2016]储能表 数位DP

    国际惯例的题面: 听说这题的正解是找什么规律,数位DP是暴力......好的,我就写暴力了QAQ.我们令f[i][la][lb][lc]表示二进制从高到低考虑位数为i(最低位为1),是否顶n上界,是否 ...

  8. BZOJ4513 SDOI2016 储能表 记忆化搜索(动态规划)

    题意: 题面中文,不予翻译:SDOI2016储能表 分析: 据说有大爷用一些奇怪的方法切掉了这道题%%%%% 这里用的是大众方法——动态规划. 其实这是一道类似于二进制数位dp的动态规划题,(但是实际 ...

  9. BZOJ4513: [Sdoi2016]储能表

    Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 j 列的格子储存着 (i xor j) 点能量. ...

随机推荐

  1. ethereum(以太坊)(基础)--容易忽略的坑(二)

    pragma solidity ^0.4.0; contract EMath{ string public _a="lin"; function f() public{ modif ...

  2. AB PLC 编程之状态机

    AB的程序设计和西门子有点PLC不大一样,在AB中没有RS指令,所以主要用move指令来作步进.今天我们就用Move指令写个AB的程序,和西门子比,有哪些不同. 控制任务 很简单的一个状态机.初始步为 ...

  3. vue---day01

    1.let和const var 全局作用域和函数作用域 存在变量提升 其实是个bug 可以重复声明 let 块级作用域 不存在变量提升 不能重复声明 const 常量 和let一样还有另外两个 定义的 ...

  4. Kubernetes-ELK

    ElasticSearch日志搜集查询和展现案例 容器中输出到控制台的日志都会以*-json.log的命名方式存储在/var/lib/container目录之下: Kubernetes采用Fluent ...

  5. BZOJ3265: 志愿者招募加强版(线性规划)

    Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 809  Solved: 417[Submit][Status][Discuss] Descriptio ...

  6. AES128加密-S盒和逆S盒构造推导及代码实现

    文档引用了<密码编码学与网络安全--原理和实践>里边的推导过程,如有不妥,请与我联系修改. 文档<FIPS 197>高级加密标准AES,里边有个S盒构造,涉及到了数论和有限域的 ...

  7. The Road to learn React书籍学习笔记(第三章)

    The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...

  8. 【转】odoo11新功能及绿色版汇总

    昆山-Jeffery 11:34:00 ,odoo11 新功能: 评论:看到截图,感觉美工上又有所提高 官方的发布说明:https://www.odoo.com/nl_NL/page/odoo-11- ...

  9. 1 opencv2.4 + vs2013

    http://blog.csdn.net/poem_qianmo/article/details/19809337 1.安装vs2013 2.安装opencv2.4 下载地址:https://sour ...

  10. VINS紧耦合优化公式及代码解析

    1.首先确定待优化的状态变量 对应代码,优化参数为: Vector3d Ps[(WINDOW_SIZE + )];(平移向量) Vector3d Vs[(WINDOW_SIZE + )];(速度) M ...