[SDOI2016]储能表——数位DP
挺隐蔽的数位DP。少见
其实减到0不减了挺难处理。。。。。然后就懵了。
其实换个思路:
xor小于k的哪些都没了,
只要留下(i^j)大于等于k的那些数的和以及个数,
和-个数*k就是答案
数位DP即可
f[i][0/1][0/1][0/1]表示,前i位,对n,m,k有无限制<=n,<=m,>=k?,xor值的总和
g[i][0/1][0/1][0/1]表示,前i位,对n,m,k有无限制<=n,<=m,>=k?,合法的方案数
然后枚举这一位的n,m数位填什么转移
注意爆int和爆long long:
1.1<<p爆int,这个还很大,必须立刻取模
2.最后tmp*k爆long long,k先对p取模
不稳啊~~
#include<bits/stdc++.h> #define reg register int #define il inline #define int long long #define numb (ch^'0') using namespace std; typedef long long ll; il void rd(ll &x){char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x); } namespace Miracle{ const int N=66; ll n,m,k; ll mod; ll f[N][2][2][2]; ll g[N][2][2][2]; int main(){ int t;rd(t);while(t--){scanf("%lld%lld%lld%lld",&n,&m,&k,&mod);--n;--m;memset(g,0,sizeof g);memset(f,0,sizeof f);g[61][1][1][1]=1; for(reg p=60;p>=0;--p){int nn=(n>>p)&1LL,nm=(m>>p)&1LL,nk=(k>>p)&1LL;// cout<<" wei "<<p<<endl;// cout<<nn<<" "<<nm<<" "<<nk<<endl;for(reg i=0;i<=1;++i){//ifor(reg j=0;j<=1;++j){//jfor(reg l=0;l<=1;++l){//lim nfor(reg r=0;r<=1;++r){//lim mfor(reg o=0;o<=1;++o){//lim kif((l&&i>nn)||(r&&j>nm)||(o&&((i^j)<nk))) continue;(f[p][((!l)||(i<nn))?0:1][((!r)||(j<nm))?0:1][((!o)||((i^j)>nk))?0:1]+=(f[p+1][l][r][o]+(ll)(i^j)*(1LL*1<<p)%mod*g[p+1][l][r][o]%mod)%mod)%=mod;(g[p][((!l)||(i<nn))?0:1][((!r)||(j<nm))?0:1][((!o)||((i^j)>nk))?0:1]+=(g[p+1][l][r][o]))%=mod;}}}}}}ll ans=0;ll tmp=0;for(reg l=0;l<=1;++l){//lim nfor(reg r=0;r<=1;++r){//lim mfor(reg o=0;o<=1;++o){//lim k(ans+=f[0][l][r][o])%=mod;(tmp+=g[0][l][r][o])%=mod; }}}k%=mod;ans=(ans%mod-tmp%mod*k%mod+mod)%mod;printf("%lld\n",ans%mod);}return 0; }} signed main(){Miracle::main();return 0; }/*Author: *Miracle*Date: 2019/2/26 18:48:55 */
如果想到统计<=k的和和个数的话,就是一个限制比较多(维度多)的数位DP罢了。
转载于:https://www.cnblogs.com/Miracevin/p/10439639.html
[SDOI2016]储能表——数位DP相关推荐
- bzoj4513 [Sdoi2016]储能表 dp
这种数位dp第一次见.. 其实应该是利用位运算相互独立来避免后效性 一般的数位dp只有一个范围 这个题有三个范围.. 由于数位和整个数的大小没直接关系,所以就需要用状态记录 首先不合法的一定不转移,对 ...
- [SDOI2016]储能表
Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 j 列的格子储存着 (i xor j) 点能量. ...
- bzoj千题计划277:bzoj4513: [Sdoi2016]储能表
http://www.lydsy.com/JudgeOnline/problem.php?id=4513 f[i][0/1][0/1][0/1] 从高到低第i位,是否卡n的上限,是否卡m的上限,是否卡 ...
- 「SDOI2016」储能表(数位dp)
「SDOI2016」储能表(数位dp) 神仙数位 \(dp\) 系列 可能我做题做得少 \(QAQ\) \(f[i][0/1][0/1][0/1]\) 表示第 \(i\) 位 \(n\) 是否到达上界 ...
- 暑假D16 T3 密道(数位DP? 打表找规律)
题意 对于一个(n+1)*(n+1)的矩阵,第一列和第一排为1,其他位置为1当且仅当上方和左方有一个1,其他为0: 对于100%的数据,n<=1e9 题解 稍微画了一下,感觉从图像看不大出来,就 ...
- CF809C(找规律+数位DP)
老年选手需要多写一些思维题qwq. 通过打表很容易发现对于(i,j),值为(i-1)^(j-1)+1,然后本题就没了qwq. 矩阵差分还是很容易想到的,容斥成四个矩阵. 然后看到异或很容易想到三件事: ...
- Xorequ(BZOJ3329+数位DP+斐波那契数列)
题目链接 传送门 思路 由\(a\bigoplus b=c\rightarrow a=c\bigoplus b\)得原式可化为\(x\bigoplus 2x=3x\). 又异或是不进位加法,且\(2x ...
- 牛客练习赛34 E little w and Digital Root(数位dp)
title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...
- SDUT - 2609 A-Number and B-Number(二分+数位dp)
题目链接:点击查看 题目大意:规定 A 数组为所有十进制下含有 7 或者可以被 7 整除的数字,例如 A 数组中的前 10 个数为: {a[1]=7,a[2]=14,a[3]=17,a[4]=21,a ...
- HDU4389(数位DP)
题目:X mod f(x) 题意:问在区间[A,B]之间,有多少个数满足,x%f(x)=0,f(x)代表x的各位数字之和. 解析:本题一是可以通过打表来计算,二是可以通过数位DP来求解. 我们先来说打 ...
最新文章
- NODEJS 使用 XLSX模块导出excel文件
- exportfs命令和FTP服务
- shell脚本--02循环与条件
- 保存Activity的状态
- Java的二十三种设计模式(适配器模式(Adapter)、对象的适配器模式)
- 在Eclipse 2.0中使用版本控制系统CVS
- 在使用 ADO.NET 导出 Excel 文件时,设置 IMEX=1 仍不能导出所有数据的解决办法
- codeforces:CF750 复盘
- 【数据结构1.3笔记】研究内容
- 中国象棋将帅问题java_编程之美读书笔记1.2——中国象棋将帅问题
- sprint test 添加事务回滚机制
- NGINX配置之二: nginx location proxy_pass 后面的url 加与不加/的区别.
- 16qam matlab 误码率,16qam的误码率公式
- mac苹果系统的电脑ip地址命令
- NTFS与FAT32区别
- FastReport for Delphi
- Javascript 在循环中使用Promise对象
- 金融直播APP方案开发
- 安卓 电子围栏_手机电子围栏是什么
- Webservice的测试环境 网上现有的几个webservice