算法学社
記錄難忘的征途
posts - 141,comments - 220,trackbacks - 0
题目描述:
   给出五个数(不超过2^63-1),让你求下面代码的sum值
for(ll i = a; i <= b; i++)
    
for(ll j = c; j<= d; j++)
        
if((i ^ j) > e)
        sum 
+= i^j;

算法分析:
   先通过容斥原理,把问题变成“[0,a]和[0,b]”。这一部分的解法如下:
  
   数位DP , dp[i][j][k][len]表示前len长度,i = 0代表a的第len位取原值,i=1代表a的第len位取1,j同理,k=0表示e的第len位取0,k=1表示取原值的,方案数。
   于是这种推,咱们可以根据i,j,k的不同写出状态转移。但是这题要求的是sum,而非方案数。所以按照这个状态再维护一个sum值。
   tp 代表当a(len) xor b(len) = 1时的方案数。那么sum值应该等于tp * (2^len) + (上面dp转移中的len-1位的sum值)

代码:
fzu 2042
posted on 2012-10-10 14:56 西月弦 阅读(414) 评论(0)  编辑 收藏 引用 所属分类: 解题报告

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理