[SDOI2016] 储能表
[SDOI2016]储能表
题目描述
有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号。每个格子都储存着能量。最初,第 i 行第 j 列的格子储存着 (i xor j) 点能量。所以,整个表格储存的总能量是,
随着时间的推移,格子中的能量会渐渐减少。一个时间单位,每个格子中的能量都会减少 1。显然,一个格子的能量减少到 0 之后就不会再减少了。
也就是说,k 个时间单位后,整个表格储存的总能量是
给出一个表格,求 k 个时间单位后它储存的总能量。
由于总能量可能较大,输出时对 p 取模。
输入格式
第一行一个整数 T,表示数据组数。接下来 T 行,每行四个整数 n、m、k、p。
输出格式
共 T 行,每行一个数,表示总能量对 p 取模后的结果
样例 #1
样例输入 #1
3
2 2 0 100
3 3 0 100
3 3 1 100
样例输出 #1
2
12
6
提示
测试点 :,, ,,;
测试点 :,,,,;
测试点 :,,,,;
测试点 :,,,,;
测试点 :,,,,;
测试点 :,,,, ;
测试点 :,,,,;
测试点 :,,,,
略微有点板的数位dp.不理解为什么是紫色。
尝试拆开,如果 小于等于 的那就不用看了,剩下的如果 大于等于 的有 个,他们的和为 ,那么答案就是
那怎么数位 dp 呢?定义 为前 位,是否有顶到 的上界和 的下界时的情况。那么转移就很简单了。枚举原式中 和 在这一位的四种填法,然后递归到下一位,若下一位答案为 ,那么这一位就是所有 之和。这应该很好理解了。
#include<bits/stdc++.h>
int t,P;
long long n,m,k;
struct node{
int cnt,ans;
node operator+(const node&n)const{
return (node){(cnt+n.cnt)%P,(ans+n.ans)%P};
}
}dp[65][2][2][2],ret,dw;
node dfs(int x,int an,int am,int ak);
node calc(int x,int an,int am,int ak,int p,int q);
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld%lld%d",&n,&m,&k,&P);
memset(dp,-1,sizeof(dp));
// printf("%d ",dp[0][0][0][0].cnt);
--n,--m;
ret=dfs(60,0,0,0);
// printf("%d %d\n",ret.cnt,ret.ans);
printf("%d\n",(ret.ans-k%P*ret.cnt%P+P)%P);
}
return 0;
}
node dfs(int x,int an,int am,int ak)
{
// if(x<1)
// printf("%d %d %d %d\n",x,an,am,ak);
if(!~x)
// printf("%d %d\n",an,am);
return (node){1,0};
if(~dp[x][an][am][ak].cnt)
return dp[x][an][am][ak];
node ret=dw;
ret=ret+calc(x,an,am,ak,0,0);
ret=ret+calc(x,an,am,ak,0,1);
ret=ret+calc(x,an,am,ak,1,0);
ret=ret+calc(x,an,am,ak,1,1);
// if(x<=1)
// printf("%d %d %d %d %d %d\n",x,an,am,ak,ret.cnt,ret.ans);
return dp[x][an][am][ak]=ret;
}
node calc(int x,int an,int am,int ak,int p,int q)
{
int nx=n>>x&1,mx=m>>x&1,kx=k>>x&1;
if(!an&&p>nx)
return dw;
if(!am&&q>mx)
return dw;
if(!ak&&(p^q)<kx)
return dw;
an|=p<nx;
am|=q<mx;
ak|=(p^q)>kx;
node ret=dfs(x-1,an,am,ak);
(ret.ans+=ret.cnt*(((p^q*1LL)<<x)%P)%P)%=P;
return ret;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!