BZOJ4513: [Sdoi2016]储能表-数位dp
2018-03-16 14:38
232 查看
传送门
,,,,T=5000,n≤1018,m≤1018,k≤1018,p≤109,,,,T=5000,n≤1018,m≤1018,k≤1018,p≤109
等等 为什么莫反会有异或操作???
…
最终发现是一道二进制下的数位dp:
f[i][0/1][0/1][0/1]f[i][0/1][0/1][0/1]表示从高到低第i位,是否到n的上界,是否到m的上界,当前异或结果是否到k的下界
对于每个状态记录合法方案数和所有合法i,j的异或和,最后把k的那些减去即可
代码:
题意:
求∑n−1i=0∑m−1j=0max((i xor j)−k,0)∑i=0n−1∑j=0m−1max((i xor j)−k,0),多组数据,,,,T=5000,n≤1018,m≤1018,k≤1018,p≤109,,,,T=5000,n≤1018,m≤1018,k≤1018,p≤109
Solution:
看到两个求和符号下意识想到莫反…等等 为什么莫反会有异或操作???
…
最终发现是一道二进制下的数位dp:
f[i][0/1][0/1][0/1]f[i][0/1][0/1][0/1]表示从高到低第i位,是否到n的上界,是否到m的上界,当前异或结果是否到k的下界
对于每个状态记录合法方案数和所有合法i,j的异或和,最后把k的那些减去即可
代码:
#include<cstdio> #include<iostream> #include<cstring> #define pii pair<int,int> using namespace std; long long n,m,nn,mm,k,kk; int T,mod,maxlen; pii f[70][2][2][2]; bool vis[70][2][2][2]; void add(int &x,int y) { x+=y; if (x>=mod) x-=mod; } pii dp(int len,bool n1,bool m1,bool k1) { if (len>maxlen) return make_pair(1,0); if (vis[len][n1][m1][k1]) return f[len][n1][m1][k1]; vis[len][n1][m1][k1]=1; int np=(n>>maxlen-len)&1,mp=(m>>maxlen-len)&1,kp=(k>>maxlen-len)&1; for (int i=0;i<=(n1?np:1);i++) for (int j=0;j<=(m1?mp:1);j++) { if (k1&&(i^j)<kp) continue; pii nw=dp(len+1,n1&&(i==np),m1&&(j==mp),k1&&((i^j)==kp)); add(f[len][n1][m1][k1].first,nw.first); add(f[len][n1][m1][k1].second,((1ll<<maxlen-len)*(i^j)%mod*nw.first+nw.second)%mod); } return f[len][n1][m1][k1]; } int main() { scanf("%d",&T); while (T--) { memset(vis,0,sizeof(vis));memset(f,0,sizeof(f)); scanf("%lld%lld%lld%d",&n,&m,&k,&mod); n--,m--; int nw=0; nn=n,mm=m,kk=k; while (nn) nw++,nn/=2;maxlen=max(nw,maxlen);nw=0; while (mm) nw++,mm/=2;maxlen=max(nw,maxlen);nw=0; while (kk) nw++,kk/=2;maxlen=max(nw,maxlen); pii ans=dp(1,1,1,1); printf("%d\n",(1ll*ans.second-1ll*k%mod*ans.first%mod+mod)%mod); } }
相关文章推荐
- [BZOJ4513] [SDOI2016] 储能表 - 数位DP
- 洛谷P4067:[SDOI2016]储能表 (数位DP)
- BZOJ 4513 [SDOI2016]储能表 【数位DP】
- bzoj 4513: [Sdoi2016]储能表 数位dp
- 【BZOJ4513】[Sdoi2016]储能表 数位DP
- BZOJ 4513: [Sdoi2016]储能表 [数位DP !]
- [bzoj4513][SDOI2016]储能表——数位dp
- BZOJ 4513: [Sdoi2016]储能表 数位dp
- BZOJ4513 [Sdoi2016]储能表
- [ AC自动机 数位DP ] [ SDOI2014 ] BZOJ3530
- [BZOJ3530][Sdoi2014]数数(AC自动机上数位DP)
- [bzoj4513][SDOI2016]储能表
- [SDOI 2016]储能表
- 洛谷P4067:储能表(数位dp)
- HDU 5898 odd-even number (数位DP) 2016 ACM/ICPC Asia Regional Shenyang Online
- [BZOJ3530][SDOI2014]数数 AC自动机+数位DP
- BZOJ 1974 [Sdoi2010] auction 代码拍卖会(数位dp)
- BZOJ 4513 [Sdoi2016]储能表
- 【2016-沈阳赛区网络赛-G】记忆化搜索,数位DP(odd-even number,hdu 5898)
- 【BZOJ4521】【CQOI2016】手机号码 数位DP