关闭

HDU 5803 Zhu's Math Problem(数位DP)

277人阅读 评论(0) 收藏 举报
分类:

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

#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;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

[ACM] hdu 3555 Bomb (数位DP,统计1-N中含有“49”的总数)

Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total S...
  • sr19930829
  • sr19930829
  • 2014-08-08 20:44
  • 1931

hdu3652 数位dp(含13且被能被13整除的数)

http://acm.hdu.edu.cn/showproblem.php?pid=3652 B-number Time Limit: 2000/1000 MS (Java/Others)...
  • u013573047
  • u013573047
  • 2015-02-22 20:38
  • 1470

hdu3534 树形dp(求树中两点之间的最大距离)

http://acm.hdu.edu.cn/showproblem.php?pid=3534 Problem Description In the Data structure...
  • u013573047
  • u013573047
  • 2015-02-14 18:19
  • 1427

HDU5803 Zhu’s Math Problem (数位DP)

题目链接:点击此处查看题目大意: 给出A、B、C、D(0≤A、B、C、D≤1018)A、B、C、D(0\leq A、B、C、D\leq 10^{18})四个数,求满足a+c>b+d、a+d≥b+ca...
  • a409082492
  • a409082492
  • 2016-08-09 11:39
  • 548

2016多校训练Contest6: 1011 Zhu’s Math Problem hdu5803

Problem Description Zhu is a powerful ACMer/OverWatcher, now a salt-fish comes to ask Zhu a diffi...
  • lqybzx
  • lqybzx
  • 2016-08-07 15:45
  • 432

2015ICPC北京区域赛K. A Math Problem(数位DP)

题意:f[1]=1,3∗f[n]∗(f[2∗n]+1)=f[2∗n]∗(1+3∗f[n]),f[2∗n] 定义g[t]为f[i]%k==t的i的个数, 求g[0]∧g[1]∧g[2]∧.....
  • baidu_27438681
  • baidu_27438681
  • 2016-10-29 21:26
  • 360

【HDU5648 BestCoder Round 76 (div1)C】【打表or数位DP】DZY Loves Math nm范围内i和j i或j的gcd之和

DZY Loves Math    Accepts: 20    Submissions: 78  Time Limit: 10000/5000 MS (Java/Others)   ...
  • snowy_smile
  • snowy_smile
  • 2016-03-20 10:03
  • 973

hdu 3693 Math teacher's homework(数位dp)

题意:给出n个数,每个数字代表0到这个数字的范围,每个里面要选一个,求异或和为K的情况总数。 做法:挺难想的一个dp,我们把这些数换成2进制组成一个表格,首先可以明确一点,只要有一位可以随便放的二进...
  • u012962816
  • u012962816
  • 2015-08-12 01:36
  • 879

HDU 5106 Bits Problem(数位DP)

题意很简单
  • u012962816
  • u012962816
  • 2014-11-17 00:23
  • 487

HDU 5106 Bits Problem (数位DP)

题目地址:HDU 5106 这个题要定义个dp结构体,dp[i][j].sum表示当前第i位还剩j个1的时候的和,dp[i][j].tot表示当前第i位还剩j个1的时候的符合要求的个数。不记录个数的...
  • u013013910
  • u013013910
  • 2015-02-02 19:24
  • 678
    个人资料
    • 访问:494169次
    • 积分:23234
    • 等级:
    • 排名:第350名
    • 原创:1877篇
    • 转载:0篇
    • 译文:0篇
    • 评论:68条
    最新评论