本来是想去学数位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());
}

最新文章

  1. 编写自己的PHP MVC框架笔记
  2. windows7 64位下环境搭建scrapy爬虫框架
  3. vim技巧
  4. Office 365 系列三 ------ 创建Office 365普通账号
  5. artdialog4.1.7 中父页面给子页面传值
  6. Populating Tree Item With Record Group In Oracle Forms
  7. VMware中安装CentOS7网络配置静态IP地址,常用配置和工具安装
  8. Spring MVC 的汉字乱码问题
  9. 哈理工软件学院&quot;兆方美迪&quot;杯第六届程序设计大赛【高年级组】--决赛 题解
  10. 党建凯,创新工场知乎团队Web前端工程师
  11. Spring.net-业务层仓储
  12. 《Android进阶》之第七篇 NDK的使用
  13. 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
  14. Android新建工程步骤(AndroidStudio)
  15. JavaScript构造函数
  16. Think_in_java_4th(并发学习二)
  17. 利用jQuery如何获取当前被点击的按钮
  18. PHP中require(),include(),require_once()和include_once()有什么区别
  19. Linux下自动清理超过指定大小文件的方法
  20. 网易云复盘:云计算前端这一年(AngularJS粉慎入)

热门文章

  1. 【XLL API 函数】 xlFree
  2. osg 纹理访问器
  3. September 12th 2016 Week 38th Monday
  4. linux crontab 学习
  5. Stanford大学机器学习公开课(四):牛顿法、指数分布族、广义线性模型
  6. Eclipse 控制console
  7. Android ANR分析(三)
  8. 第一部分:使用iReport制作报表的详细过程(Windows环境下)
  9. HP SAN Switch光纖交換機命令行畫zone
  10. uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结,看完全明白了