【BZOJ4513】[Sdoi2016]储能表

Description

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

随着时间的推移,格子中的能量会渐渐减少。一个时间单位,每个格子中的能量都会减少 1。显然,一个格子的能量减少到 0 之后就不会再减少了。
也就是说,k 个时间单位后,整个表格储存的总能量是,
给出一个表格,求 k 个时间单位后它储存的总能量。
由于总能量可能较大,输出时对 p 取模。

Input

第一行一个整数 T,表示数据组数。接下来 T 行,每行四个整数 n、m、k、p。

Output

共 T 行,每行一个数,表示总能量对 p 取模后的结果

Sample Input

3
2 2 0 100
3 3 0 100
3 3 1 100

Sample Output

2
12
6

HINT

T=5000,n≤10^18,m≤10^18,k≤10^18,p≤10^9

题解:神级数位DP。

用f[x][0/1][0/1][0/1]表示前x位,当前i<n还是i=n,j<m还是j=m,i^j>k还是i^j=k 的(i,j)个数。

g[x][0/1][0/1][0/1]表示这些数的和。

转移过程我已无力描述,不过代码还是很可读的~

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
ll n,m,K,P;
ll ans,cnt,sum;
ll f[70][2][2][2],g[70][2][2][2];
inline ll rd()
{
ll ret=0; char gc=getchar();
while(gc<'0'||gc>'9') gc=getchar();
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret;
}
void work()
{
n=rd(),m=rd(),K=rd(),P=rd();
int i,a,b,c,x,y,z,A,B,C;
ll ni,mi,ki;
memset(f,0,sizeof(f)),memset(g,0,sizeof(g));
f[61][1][1][1]=1;
for(i=60;i>=0;i--) for(a=0;a<=1;a++) for(b=0;b<=1;b++) for(c=0;c<=1;c++) if(f[i+1][a][b][c])
{
ni=(n>>i)&1,mi=(m>>i)&1,ki=(K>>i)&1;
for(x=0;x<=1;x++) if(!a||x<=ni) for(y=0;y<=1;y++) if(!b||y<=mi)
{
z=x^y;
if(c&&z<ki) continue;
A=a&&x==ni,B=b&&y==mi,C=c&&z==ki;
f[i][A][B][C]=(f[i][A][B][C]+f[i+1][a][b][c])%P;
g[i][A][B][C]=(g[i][A][B][C]+g[i+1][a][b][c])%P;
if(z) g[i][A][B][C]=(g[i][A][B][C]+(1ll<<i)%P*f[i+1][a][b][c]%P)%P;
}
}
printf("%lld\n",(g[0][0][0][0]-K%P*f[0][0][0][0]%P+P)%P);
}
int main()
{
int T=rd();
while(T--) work();
return 0;
}

最新文章

  1. 轻量级表达式树解析框架Faller
  2. Azure PowerShell (10) 使用PowerShell导出订阅下所有的Azure VM和Cloud Service的高可用情况
  3. Sublime text 3安装Emmet
  4. 如何在centos上安装epel源
  5. Learning to Rank 之 listwise ranking
  6. Ext-设置form表单不可编辑
  7. vnc 登录后只有终端 没有桌面 黑屏
  8. CATransform3D
  9. maven3常用命令、java项目搭建、web项目搭建详细图解
  10. 这10篇 iOS 热文,你别错过哦
  11. B趣味求和
  12. [BZOJ]3532: [Sdoi2014]Lis
  13. poj-3522 最小生成树
  14. H5 俄罗斯方块Demo
  15. echart的x换行
  16. 力扣(LeetCode)804. 唯一摩尔斯密码词
  17. Family 科
  18. 11g新特性-自动sql调优(Automatic SQL Tuning)
  19. laravel在控制器中动态创建数据表
  20. 20165205 2017-2018-2 《Java程序设计》第七周学习总结

热门文章

  1. shell脚本中执行mysql 语句,去除warning using a password on the command line interface can be insecure信息
  2. oracle 使用REGEXP_SUBSTR正则表达式拆分字符串
  3. CSS经验库
  4. Android横竖屏布局总结
  5. core文件无堆栈信息定位的思路
  6. .NET面试题(三)
  7. jfinal的configPlugin基本配置代码
  8. 点滴积累【JS】---JS小功能(onmouseover实现选择月份)
  9. 矩阵乘法C语言实现
  10. JS检查浏览器类型和版本号