本来是想去学数位DP,作死挑了这道题,爆炸。。。

听说正确姿势应该是去做bzoj4521【手机】,听说迪克们当场都A了,Orz

然后对于4513,我只想说,一、脸、懵、逼

首先,我是无论如何都无法想到f[i][x][y][z]精妙的表示方式的

……讲不下去了,搬来罗爷爷的blog救场http://yyhslyz.is-programmer.com/posts/199294.html

好吧我承认这道题我完全没理解。。。。

代码可以看lych的blog.

不过其中又get了一个bug,原来<的优先级大于^,2333

-----------------------------------------------

首先,数位dp是啥.

它一般与二进制,异或有关,有些比较容易看出来,有些并不.

解决问题的核心思想就是逐位确定.

我还是想再说一遍,感觉自己做dp题还是没有任何的长进,可能弱菜看过的题太少.

#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 105
#define ad add
#define ll long long
using namespace std;
ll n,m,k,T; ll p,lenm,lenn,lenk,tmp,len,a[N],b[N],c[N],f[N][][][],g[N][][][],bin[N];
void add(ll &x,ll y)
{
  x+=y;if(x>=p)x-=p;
}
ll max(ll a,ll b)
{
  if(a>b) return a;else return b;
}
int main()
{
  scanf("%d",&T);
  while(T--)
  {
    scanf("%lld%lld%lld%lld",&m,&n,&k,&p);
    memset(a,,,,sizeof(c));
    lenm=;)a[++lenm]=m&;
    lenn=;)b[++lenn]=n&;
    lenk=;)c[++lenk]=k&;
    len=max(max(lenm,lenn),lenk);
    bin[]=;;i<=len;i++)bin[i]=(bin[i-]<<)%p;
    memset(f,,,sizeof(g));
        ; x<; x++) ; y<; y++) ; z<; z++)
            ; u<((x)?:a[]); u++)
                ; v<((y)?:b[]); v++)
                    ] || z){
                        ad(f[][x][y][z],((u^v)-c[]+p)%p);
                        ad(g[][x][y][z],);
                    }
    ; i<=len; i++)
            ; x<; x++) ; y<; y++) ; z<; z++)
                ; u<=max(x,a[i]); u++)
                    ; v<=max(y,b[i]); v++)
                        if ((u^v)>=c[i] || z){
                            int j=x|(u<a[i]),k=y|(v<b[i]),l=z|((u^v)>c[i]);
                            tmp=(ll)g[i-][j][k][l]*((u^v)-c[i])*bin[i-]%p;
                            ) tmp+=p; ad(tmp,f[i-][j][k][l]);
                            ad(f[i][x][y][z],tmp);
                            ad(g[i][x][y][z],g[i-][j][k][l]);
                        }
    printf(][][]);
  }
}

2016/06/01

[bzoj4521]

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define mo 998244353
using namespace std;
ll x,y,n,dp[][][][][][][];
];
ll solve(ll x)
{
  n=;int p,q,r;
  while(x)
  {
    a[++n]=x%;x/=;
  }
  );
  ;i<=n/;i++)swap(a[i],a[n-i+]);
  memset(dp,,sizeof(dp));
  ;i<a[];i++)
   ;j<=;j++){
     ||j==)p=;;
     ||j==)q=;;
     dp[][i][j][p][q][][]=;
   }
  ;j<a[];j++){
    ]==||j==)p=;;
    ]==||j==)q=;;
    dp[][a[]][j][p][q][][]=;
  }
  ]==||a[]==)p=;;
  ]==||a[]==)q=;;
  dp[][a[]][a[]][p][q][][]=;
  ;i<n;i++)
   ;j<=;j++)
    ;k<=;k++)
     ;I<=;I++)
      ;J<=;J++)
       ;K<=;K++)
        ;l<=;l++){
          )p=;else p=I;
          )q=;else q=J;
          ;else r=K;
          dp[i+][k][l][p][q][r][]+=dp[i][j][k][I][J][K][];
          ])dp[i+][k][l][p][q][r][]+=dp[i][j][k][I][J][K][];
           ])dp[i+][k][l][p][q][r][]+=dp[i][j][k][I][J][K][];
        }
  ll ans=;
  ;i<=;i++)
   ;j<=;j++)
    ;k<=;k++)
     ans+=dp[n][i][j][][][][k]+dp[n][i][j][][][][k]+dp[n][i][j][][][][k];

  return ans;
}
int main()
{
  scanf("%lld%lld",&x,&y);
  printf());
}

【bzoj4513】储能表【数位DP】的更多相关文章

  1. 【BZOJ4513】[Sdoi2016]储能表 数位DP

    [BZOJ4513][Sdoi2016]储能表 Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 ...

  2. BZOJ4513: [Sdoi2016]储能表(数位dp)

    题意 题目链接 Sol 一点思路都没有,只会暴力,没想到标算是数位dp??Orz 首先答案可以分成两部分来统计 设 \[ f_{i,j}= \begin{aligned} i\oplus j & ...

  3. [bzoj4513][SDOI2016]储能表——数位dp

    题目大意 求 \[\sum_{i = 0}^{n-1}\sum_{j=0}^{m-1} max((i\ xor\ j)\ -\ k,\ 0)\ mod\ p\] 题解 首先,开始并没有看出来这是数位d ...

  4. BZOJ 4513: [Sdoi2016]储能表 [数位DP !]

    4513: [Sdoi2016]储能表 题意:求\[ \sum_{i=0}^{n-1}\sum_{j=0}^{m-1} max((i\oplus j)-k,0) \] 写出来好开心啊...虽然思路不完 ...

  5. BZOJ.4513.[SDOI2016]储能表(数位DP)

    BZOJ 洛谷 切了一道简单的数位DP,终于有些没白做题的感觉了...(然而mjt更强没做过这类的题也切了orz) 看部分分,如果\(k=0\),就是求\(\sum_{i=0}^n\sum_{j=0} ...

  6. [SDOI2016]储能表——数位DP

    挺隐蔽的数位DP.少见 其实减到0不减了挺难处理.....然后就懵了. 其实换个思路: xor小于k的哪些都没了, 只要留下(i^j)大于等于k的那些数的和以及个数, 和-个数*k就是答案 数位DP即 ...

  7. 4513: [Sdoi2016]储能表 数位DP

    国际惯例的题面: 听说这题的正解是找什么规律,数位DP是暴力......好的,我就写暴力了QAQ.我们令f[i][la][lb][lc]表示二进制从高到低考虑位数为i(最低位为1),是否顶n上界,是否 ...

  8. bzoj4513 储能表

    求 $\sum\limits_{i=0}^{n-1} \sum\limits_{j=0}^{m-1} max((x \space xor \space j) - k,0)$ ,膜 $p$ $n,m \ ...

  9. BZOJ4513 SDOI2016储能表(数位dp)

    如果n.m.k都是2的幂次方,答案非常好统计.于是容易想到数位dp,考虑每一位是否卡限制即可,即设f[i][0/1][0/1][0/1]为第i位是/否卡n.m.k的限制时,之前的位的总贡献:g[i][ ...

随机推荐

  1. September 19th 2016 Week 39th Monday

    We come nearest to the great when we are great in humility. 我们最为谦逊的时候越接近伟大. When you are powerful en ...

  2. (转)Ehcache 整合Spring 使用页面、对象缓存

    Ehcache在很多项目中都出现过,用法也比较简单.一般的加些配置就可以了,而且Ehcache可以对页面.对象.数据进行缓存,同时支持集群/分布式缓存.如果整合Spring.Hibernate也非常的 ...

  3. NYOJ题目872开会

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsoAAAKwCAIAAAAOTc6wAAAgAElEQVR4nO3dO3LcSpOG4dkEfS6Edi

  4. 《Thinking in Java》十七章_容器深入研究_练习12(Page484)

    练习12: 练习使用HashMap / LinkedHashMap / TreeMap import java.util.HashMap; import java.util.LinkedHashMap ...

  5. 20145206邹京儒《Java程序设计》第2周学习总结

    20145206 <Java程序设计>第2周学习总结 教材学习内容总结 一.类型 Java可区分为基本类型和类类型两大类型系统,其中,类类型也称为参考类型. 在Java中的基本类型主要可区 ...

  6. java web开发环境配置

    一:安装jdk   http://www.java.com/zh_TW/ 二:下载tomcat,这里是zip版.http://tomcat.apache.org/download-70.cgi 三:在 ...

  7. Java内存泄露的理解与解决

    依赖于引用判断的内存管理机制 Java中对内存对象的访问,使用的是引用的方式.在Java代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间.在Ja ...

  8. python实现学生选课系统 面向对象的应用:

    一.要求: 选课系统 管理员: 创建老师:姓名.性别.年龄.资产 创建课程:课程名称.上课时间.课时费.关联老师 使用pickle保存在文件 学生: 学生:用户名.密码.性别.年龄.选课列表[].上课 ...

  9. 【JAVA中String、StringBuffer、StringBuilder类的使用】

    一.String类概述 1.String对象一旦创建就不能改变. 2.字符串常量池. 字符串常量池的特点:池中有则直接使用,池中没有则创建新的字符串常量. 例1: public class Strin ...

  10. [LeetCode] Word Break II (TLE)

    Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each ...