本来是想去学数位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. IOS - 响应者链条

    简单来说就是:一级一级的找到响应的视图,如果没有就传给UIWindow实例和UIApplication实例,要是他们也处理不了,就丢弃这次事件... 对于IOS设备用户来说,他们操作设备的方式主要有三 ...

  2. IOS- 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序

    /*******************************快速排序 start**********************************///随即取 当前取第一个,首先找到第一个的位置 ...

  3. PDO(数据访问抽象层)

    自带事务功能,多条sql同时执行时,如果其中一条执行失败,那么所有的都执行失败.开启了事务,可以进行回滚操作,让程序变得更安全. 1.访问不同的数据库2.自带事务功能3.防止SQL注入:分两次发送 / ...

  4. 解决Windows10下80端口被PID为4的System占用的问题

    一.背景 最近由于好奇心,更新了windows10系统,感觉上手还蛮快,而且体验还不错,但是在IDEA中做开发时,使用80端口进行启动项目的时候发现端口被占用了,于是尝试解决这个问题.具体步骤如下,分 ...

  5. CLR via C#(03)- 对象创建和类型转换

    一. 创建对象 CLR要求用new操作符创建对象,这个操作符在编译时产生的IL指令为newobj.例如: Student XiaoJing=new Student(“XiaoJing”,”1986”) ...

  6. jquery.query.js 插件(示例及简单应用)

    帮助文档 var url = location.search; > "?action=view&section=info&id=123&debug&te ...

  7. java web开发环境配置

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

  8. .NET 在浏览器中下载TXT文件

    通常我们用浏览器打开Txt文件时候,浏览器会直接打开,我们想要txt下载到本地该怎么操作,用js也可以,单不能兼容所有的浏览器,所以我们可以在服务端做处理,代码如下: //TXT文件生成页面 publ ...

  9. 【JAVA集合框架之List】

    一.List接口概述. List有个很大的特点就是可以操作角标. 下面开始介绍List接口中相对于Collection接口比较特别的方法.在Collection接口中已经介绍的方法此处就不再赘述. 1 ...

  10. 在iMac机os x上装win7双系统经验心得

    首先,以上iMac的内存超过4GB,需要安装x64版的win7,可以用QQ旋风从这里下载(cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso) 下载 ...