HDU 5803 Zhu's Math Problem(数位DP)
2016-08-30 17:58
507 查看
Description
给出四个整数A,B,C,D,问有多少四元组(a,b,c,d)满足a+c>b+d,a+d≥b+c,其中0<=a<=A,0<=b<=B,0<=c<=C,0<=d<=D,
Input
第一行一整数T表示用例组数,每组用例输入四个整数A,B,C,D
Output
对于每组用例,输出满足条件的四元组个数
Sample Input
1
2 1 1 1
Sample Output
10
Solution
将a,b,c,d拆成二进制用数位DP做,若a和c已经填的位与b和d已经填的位的差值大与等于2那么之后的较低位怎么填都满足a+c>b+d的条件,若小于等于-2那么之后的较低位怎么填都不会满足a+c>b+d,至于a+d≥b+c同理,所以每次枚举范围在-2~2之间
Code
给出四个整数A,B,C,D,问有多少四元组(a,b,c,d)满足a+c>b+d,a+d≥b+c,其中0<=a<=A,0<=b<=B,0<=c<=C,0<=d<=D,
Input
第一行一整数T表示用例组数,每组用例输入四个整数A,B,C,D
Output
对于每组用例,输出满足条件的四元组个数
Sample Input
1
2 1 1 1
Sample Output
10
Solution
将a,b,c,d拆成二进制用数位DP做,若a和c已经填的位与b和d已经填的位的差值大与等于2那么之后的较低位怎么填都满足a+c>b+d的条件,若小于等于-2那么之后的较低位怎么填都不会满足a+c>b+d,至于a+d≥b+c同理,所以每次枚举范围在-2~2之间
Code
#include<cstdio> #include<iostream> #include<cstring> using namespace std; typedef long long ll; #define mod 1000000007 int T,dp[66][16][5][5]; ll a[4]; int dfs(int pos,int v1,int v2,int fp) { if(pos<0) { if(v1>0&&v2>=0)return 1; return 0; } if(dp[pos][fp][v1+2][v2+2]!=-1)return dp[pos][fp][v1+2][v2+2]; int ans=0,up[4]; for(int i=0;i<4;i++) { if(fp&(1<<i))up[i]=1; else up[i]=(a[i]>>pos)&1; } for(int i=0;i<=up[0];i++) { for(int j=0;j<=up[1];j++) { for(int k=0;k<=up[2];k++) { for(int l=0;l<=up[3];l++) { int w1=v1*2+i+k-j-l; int w2=v2*2+i+l-j-k; if(w1<=-2)continue; if(w2<=-2)continue; if(w1>2)w1=2; if(w2>2)w2=2; int temp=fp; if(i!=up[0])temp|=1; if(j!=up[1])temp|=2; if(k!=up[2])temp|=4; if(l!=up[3])temp|=8; ans+=dfs(pos-1,w1,w2,temp),ans%=mod; } } } } return dp[pos][fp][v1+2][v2+2]=ans; } int main() { scanf("%d",&T); while(T--) { memset(dp,-1,sizeof(dp)); for(int i=0;i<4;i++)scanf("%lld",&a[i]); printf("%d\n",dfs(60,0,0,0)); } return 0; }
相关文章推荐
- hdu 5803 Zhu’s Math Problem (2016多校第六场1011)数位dp
- Hdu 5803 Zhu’s Math Problem(非记忆化数位dp)
- HDU5803 Zhu’s Math Problem (数位DP)
- hdu 5435 A serious math problem 数位dp
- hdu 5435 A serious math problem(数位dp)
- hihoCoder 1259 A Math Problem 数位dp
- UVALive 7271 A Math Problem 【数位dp计数】
- hdu 1757 A Simple Math Problem(矩阵优化DP)
- [HDU5435] A serious math problem(数位dp)
- uvalive7271(A Math Problem) 数位dp
- Hihocoder 1259 :A Math Problem(2015 北京区域赛 K,二进制的数位dp)
- hdu 5648 DZY Loves Math (打巨表||数位DP)
- hihoCode 1249 A Math Problem ACM/ICPC 2015 Beijing (数位dp+规律)
- 小白算法练习 hdu 不要62 POJ 2282 the Counting problem 数位dp
- 数位dp-hdu-3693-Math teacher's homework
- HDU 2993 MAX Average Problem【斜率优化dp】
- HDU 4389 X mod f(x) 数位统计DP
- Hdu 4057 Rescue the Rabbit (AC自动机+状态压缩dp) - 2011 ACM-ICPC Dalian Regional Contest Problem G
- HDU 4389 X mod f(x)[数位统计dp]
- HDU 4389 X mod f(x)[数位统计dp]