[数位DP] Codeforces 809C. Find a car
2017-09-02 09:35
513 查看
要先找规律啊…
位置 (x,y) 的数是 (x−1)⊕(y−1)+1,⊕ 表示异或
那么答案就是求∑x≤x1,y≤y1((x−1)⊕(y−1)+1)[(x−1)⊕(y−1)+1≤k]
在二进制下x,y,k三个限制一起考虑转移。
情况很多,但是可以枚举x,y的当前分别选了0还是1,这样代码复杂度就小很多。
位置 (x,y) 的数是 (x−1)⊕(y−1)+1,⊕ 表示异或
那么答案就是求∑x≤x1,y≤y1((x−1)⊕(y−1)+1)[(x−1)⊕(y−1)+1≤k]
在二进制下x,y,k三个限制一起考虑转移。
情况很多,但是可以枚举x,y的当前分别选了0还是1,这样代码复杂度就小很多。
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; typedef long long ll; const int P=1e9+7; int q; ll f[40][5][5][5],g[40][5][5][5]; inline ll calc(int x,int y,int n){ if(x<0 || y<0) return 0; ll ret=0; for(int i=0;i<=1;i++) for(int j=0;j<=1;j++) for(int k=0;k<=1;k++) f[32][i][j][k]=g[32][i][j][k]=0; f[32][1][1][1]=1; for(int i=32;i;i--){ for(int j=0;j<=1;j++) for(int k=0;k<=1;k++) for(int s=0;s<=1;s++) f[i-1][j][k][s]=g[i-1][j][k][s]=0; for(int j=0;j<=1;j++) for(int k=0;k<=1;k++) for(int s=0;s<=1;s++){ if(!f[i][j][k][s]) continue; for(int a=0;a<=1;a++) for(int b=0;b<=1;b++){ if(k && a>((x>>i-1)&1)) continue; if(s && b>((y>>i-1)&1)) continue; if(j && (a^b)>((n>>i-1)&1)) continue; int A=(j && (a^b)==((n>>i-1)&1)),B=(k && a==((x>>i-1)&1)),C=(s && b==((y>>i-1)&1)); (f[i-1][A][B][C]+=f[i][j][k][s])%=P,(g[i-1][A][B][C]+=g[i][j][k][s]*2+(a^b)*f[i][j][k][s])%=P; } } } for(int i=0;i<=1;i++) for(int j=0;j<=1;j++) for(int k=0;k<=1;k++) (ret+=f[0][i][j][k]+g[0][i][j][k])%=P; return ret; } int main(){ scanf("%d",&q); while(q--){ int a1,b1,a2,b2,k; scanf("%d%d%d%d%d",&a1,&b1,&a2,&b2,&k); a1--; b1--; a2--; b2--; k--; //calc(1,0,1000); //cout<<calc(a2,b2,k)<<' '<<calc(a1-1,b2,k)<<' '<<calc(a2,b1-1,k)<<' '<<calc(a1-1,b1-1,k)<<endl; printf("%lld\n",(calc(a2,b2,k)+P-calc(a1-1,b2,k)+P-calc(a2,b1-1,k)+calc(a1-1,b1-1,k))%P); } }
相关文章推荐
- [数位DP][线性基]Codeforces 388D. Fox and Perfect Sets
- [数位DP AC自动机] Codeforces 434C. Tachibana Kanade's Tofu
- Codeforces 628D 偶数位全是某个数 数位dp
- Codeforces 55D. Beautiful numbers (数位DP)
- CodeForces 55D Beautiful numbers(数位dp)
- codeforces 628D. Magic Numbers 数位dp
- CodeForces 55D Beautiful numbers(数位dp)
- codeforces 401D. Roman and Numbers 数位dp
- codeforces 55D Beautiful numbers(数位dp)
- 【数位DP】 【CodeForces 55D】
- CodeForces 55D Beautiful numbers (数位DP)
- Codeforces 96E(数位dp)
- codeforces 55d A.Beautiful numbers 数位DP -
- CodeForces 258 B.Little Elephant and Elections(数位DP+dfs)
- 【codeforces】55D. Beautiful numbers 数位DP
- Codeforces 834E The Bakery【枚举+数位dp】
- codeforces--507D--The Maths Lecture(数位dp)
- CodeForces 55D Beautiful numbers 数位dp 离散化
- codeforces 855E 数位DP
- codeforces 9C 数位DP做法