洛谷P4067:储能表(数位dp)
2018-03-21 15:39
225 查看
题面
传说中的数位dp,考试时因为long long 炸20
其实知道难写应该先水其他题的暴力
传说中的数位dp,考试时因为long long 炸20
其实知道难写应该先水其他题的暴力
#include <iostream> #include <fstream> #include <algorithm> #include <cmath> #include <ctime> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; #define mmst(a, b) memset(a, b, sizeof(a)) #define mmcp(a, b) memcpy(a, b, sizeof(b)) typedef long long LL; const int N=110; int T; LL n,m,K,p; LL er ,me ; LL f [2][2],g [2][2],ff [2][2],gg [2][2]; bool vg [2][2],vf [2][2]; LL ans,ans1,ans2; void dp() { for(int i=0;i<=60;i++) for(int j=0;j<=1;j++) for(int k=0;k<=1;k++) ff[i][j][k]=gg[i][j][k]=vg[i][j][k]=vf[i][j][k]=g[i][j][k]=f[i][j][k]=0; vf[60][1][1]=ff[60][1][1]=1; for(int i=59;i>=0;i--) { for(int j=1;j>=0;j--) for(int k=1;k>=0;k--) { for(int j1=1;j1>=0;j1--) for(int k1=1;k1>=0;k1--) { if(j==1&&(n&er[i])==0&&j1) continue; if(k==1&&(m&er[i])==0&&k1) continue; int nj=j,nk=k; if((n&er[i])&&!j1) nj=0; if((m&er[i])&&!k1) nk=0; if(vg[i+1][j][k]) { g[i][nj][nk]=(g[i][nj][nk]+g[i+1][j][k]*2+(j1^k1)*gg[i+1][j][k])%p; gg[i][nj][nk]=(gg[i][nj][nk]+gg[i+1][j][k])%p; vg[i][nj][nk]=1; } if(vf[i+1][j][k]) { if(((j1^k1)==0&&(K&er[i])==0)||((j1^k1)&&(K&er[i]))) { f[i][nj][nk]=(f[i][nj][nk]+f[i+1][j][k]*2+(j1^k1)*ff[i+1][j][k])%p; ff[i][nj][nk]=(ff[i][nj][nk]+ff[i+1][j][k])%p; vf[i][nj][nk]=1; } if((j1^k1)==0&&(K&er[i])) { g[i][nj][nk]=(g[i][nj][nk]+f[i+1][j][k]*2)%p; gg[i][nj][nk]=(gg[i][nj][nk]+ff[i+1][j][k])%p; vg[i][nj][nk]=1; } } } } } for(int j=0;j<=1;j++) for(int k=0;k<=1;k++) { ans1=(ans1+f[0][j][k]+g[0][j][k])%p; ans2=(ans2+ff[0][j][k]+gg[0][j][k])%p; } } int main() { er[0]=1; for(int i=1;i<=62;i++) er[i]=er[i-1]*2; cin>>T; while(T--) { LL kk; scanf("%lld%lld%lld%lld",&n,&m,&kk,&p); ans=ans1=ans2=0; for(int i=0;i<=62;i++) me[i]=er[i]%p; n--; m--; K=1152921504606846975ll; dp(); ans=ans1; K=kk; ans1=ans2=0; dp(); ans2=(((n+1)%p)*((m+1)%p)%p-ans2+p)%p; ans=(ans-ans1+p)%p; ans=(ans-ans2*(K%p)%p+p)%p; printf("%lld\n",ans); } return 0; }
相关文章推荐
- 洛谷P4067:[SDOI2016]储能表 (数位DP)
- [bzoj4513][SDOI2016]储能表——数位dp
- BZOJ 4513 [SDOI2016]储能表 【数位DP】
- [找规律 递归子问题 || 数位DP] BZOJ 4513 [Sdoi2016]储能表
- 【BZOJ4513】[Sdoi2016]储能表 数位DP
- [BZOJ4513] [SDOI2016] 储能表 - 数位DP
- BZOJ 4513: [Sdoi2016]储能表 数位dp
- bzoj 4513: [Sdoi2016]储能表 数位dp
- BZOJ 4513: [Sdoi2016]储能表 [数位DP !]
- 【bzoj4513】储能表【数位DP】
- BZOJ4513: [Sdoi2016]储能表-数位dp
- hdu4734(数位DP)
- 数位DP--HDU4722(Good Numbers)
- hdu 6156 Palindrome Function(数位dp&&其他)
- HDU 3555 水数位dp
- 【POJ3208】传说中POJ最难的数位DP?(正解AC自动机,二解数位DP,吾异与之)
- 动态规划晋级——HDU 3555 Bomb【数位DP详解】
- 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)
- POJ - 3252 Round Numbers (数位dp&位运算)
- Mutual Training for Wannafly Union #6 [SPOJ - VECTAR1] Matrices with XOR property 二维线段树 数位dp