51Nod 1684 子集价值 (平方和去括号技巧)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1684
题意:
新建一个位运算,求所有子集通过这个位运算后的答案的平方和是多少。
先想弱化版:
新建一个位运算,求所有子集通过这个位运算后的答案的和是多少。
枚举每一个二进制位,看有多少个子集能够使这一位为1
dp[i]表示前i个数中,能使枚举的这一位为1的方案数
根据第i个数选或者是不选转移
ans= Σ 2^j * 第j位的dp[n]
这里是平方和
设一个子集位运算后的结果为x,它对答案的贡献为x^2
把x按二进制拆为p位,即(x0+x1+x2+x_p-1)
其中xi表示2^i
那它对答案的贡献为 (x0+x1+x2+x_p-1)^ 2
去括号就是 x0*x0+x0*x1+……+x0*x_p-1+……+ x_p-1 * x0+x_p-1 * x1+…… x_p-1 * x_p-1
即 Σ Σ xi*xj i,j ∈[0,p)
每一项至于两位有关
所以枚举任意两位a,b
dp[i][0/1][0/1]表示前i个数,第a位为0/1,第b位为0/1的方案数
ans= Σ Σ 2^(i+j) * 枚举的两位为i和j时的dp[n][1][1]
即dp求的是表达式中每一项的系数
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; #define N 50001 const int mod=1e9+; int n,p;
int to[][];
int b[N]; int dp[N][][]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int get(int p,int q)
{
memset(dp,,sizeof(dp));
bool pp,qq;
for(int i=;i<=n;++i)
{
pp=b[i]>>p&;
qq=b[i]>>q&;
dp[i][pp][qq]++;
dp[i][pp][qq]-=dp[i][pp][qq]>=mod ? mod : ;
for(int j=;j<;++j)
for(int k=;k<;++k)
{
dp[i][j][k]+=dp[i-][j][k];
dp[i][j][k]-=dp[i][j][k]>=mod ? mod : ;
dp[i][to[j][pp]][to[k][qq]]+=dp[i-][j][k];
dp[i][to[j][pp]][to[k][qq]]-=dp[i][to[j][pp]][to[k][qq]]>=mod ? mod : ;
}
}
return dp[n][][];
} int main()
{
read(n); read(p);
for(int i=;i<;++i)
for(int j=;j<;++j)
read(to[i][j]);
for(int i=;i<=n;++i) read(b[i]);
int ans=;
for(int i=;i<p;++i)
for(int j=;j<p;++j)
{
ans+=(1LL<<i+j)%mod*(long long)get(i,j)%mod;
ans-=ans>=mod ? mod : ;
}
cout<<ans;
}
lyk最近在研究位运算。
它发现除了xor,or,and外还有很多运算。
它新定义了一种运算符“#”。
具体地,可以由4个参数来表示。
ai,j表示
i#j。
其中i,j与a的值均∈[0,1]。
当然问题可以扩展为>1的情况,具体地,可以将两个数分解为p位,然后对于每一位执行上述的位运算,再将这个二进制串转化为十进制就可以了。
例如当 a0,0=a1,1=0,a0,1=a1,0=1时,3#4在p=3时等于7,2#3在p=4时等于1(实际上就是异或运算)。
现在lyk想知道的是,已知一个数列b。
它任意选取一个序列c,满足 c1<c2<...<ck,其中1≤c1且ck≤n ,这个序列的价值为 bc1 # bc2 #...# bck 的平方。
这里我们假设k是正整数,因此满足条件的c的序列一定是 2n−1 。lyk想知道所有满足条件的序列的价值总和是多少。
例如样例中,7个子集的价值分别为1,1,4,4,9,9,0。总和为28。
由于答案可能很大,只需对1,000,000,007取模即可。
第一行两个整数n(1<=n<=50000),p(1<=p<=30)。
第二行4个数表示a0,0,a0,1,a1,0,a1,1。(这4个数都∈{0,1})
第三行n个数bi(0<=bi<2^p)。
一行表示答案。
3 30
0 1 1 0
1 2 3
28
51Nod 1684 子集价值 (平方和去括号技巧)的更多相关文章
- 51nod 1684 子集价值
lyk最近在研究位运算. 它发现除了xor,or,and外还有很多运算. 它新定义了一种运算符“#”. 具体地,可以由4个参数来表示. ai,j表示 i#j. 其中i,j与a的值均∈[0,1]. 当然 ...
- [51nod1684]子集价值
lyk最近在研究位运算. 它发现除了xor,or,and外还有很多运算. 它新定义了一种运算符"#". 具体地,可以由4个参数来表示. ai,j表示 i#j. 其中i,j与a的值均 ...
- POJ1690 简单运算去括号
题目大意: 给定一串只含加减和括号的运算,去掉没用的括号和空白字符输出 这里其实只要去找当前括号前面那个运算符是不是减号,如果是减号且这个括号内出现过运算符说明这个括号应该存在 #include &l ...
- 51NOD 区间的价值 V2
http://www.51nod.com/contest/problem.html#!problemId=1674 因为题目要求的只是& 和 | 这两个运算.而这两个运算产生的值是有限的. & ...
- bat文件去括号
@Echo Off&SetLocal ENABLEDELAYEDEXPANSION FOR %%a in (*) do ( set "name=%%a" set " ...
- 【bzoj1561】[JSOI2009]去括号
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> # ...
- SCI科技论文写作技巧-核心价值
第一次写SCI论文写作技巧,本身不是大牛,也许没有资金格谈论这个. 这里仅仅是一些个人思考,不正确,好还是不好.而当另一种理论. 对于工程专业的学生,谁往往应用,书写SCI事情.当然,也不是没可能.全 ...
- 傻瓜方法求集合的全部子集问题(java版)
给定随意长度的一个集合.用一个数组表示,如{"a", "b","c"},求它的全部子集.结果是{ {a}, {b}, {c}, {a,b}, ...
- Java实现带括号优先级的计算器
这个计算器不仅能够进行四则运算,还支持添加括号进行优先级计算,例如下面算式: 10+(2*16-20/5)+7*2=52 Java源代码: import java.awt.BorderLayout; ...
随机推荐
- 使用C#创建WCF服务控制台应用程序
本文属于原创,转载请注明出处,谢谢! 一.开发环境 操作系统:Windows 10 开发环境:VS2015 编程语言:C# IIS版本:10.0.0.0 二.添加WCF服务.Internet Info ...
- Lambda学习---StreamApi使用
package com.zx; import com.zx.entity.Book; import org.junit.Test; import java.time.LocalDate; import ...
- 完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询
相关阅读: 完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能 完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制 自APIJSON发布 ...
- 代理神器allproxy
背景 allproxy意为all as proxy,即是说所有设备均可以成为一个网络代理,唯一的要求就是有网络访问权限. 一般的代理软件要求宿主机必须有公网地址,然后才能把网络代理出去,但在实际情况下 ...
- 1. Python3 环境搭建
Python3 环境搭建 开门见山,其他关于Python发展史.语言类型.优缺点等等 可以自己去百度百度,这里就不多说了.其实基本想要学这门语言的时候,你已经了解差不多了!!! Python的运行环境 ...
- html5实现拖拽上传头像
1. 将客户端(本地电脑)中的图片拖到网页中 要点: html5 拖放, FileReader html: <div id="container" ondrop=" ...
- 【Beta阶段】第四次Scrum Meeting!
每日任务内容: 本次会议为第四次Scrum Meeting会议~ 由于本次会议女生今日因身体不适未参与会议,故在宿舍楼开会,大家集会15分钟. 队员 昨日完成任务 明日要完成任务 刘乾 #130 学习 ...
- Ubuntu16.04配置TOMCAT8
基于虚拟机Ubuntu16.04配置Tomcat过程 一.安装JDK 首先要确定好要安装的jdk和tomcat版本能对的上,具体如图所示: 版本选择是Jdk1.8,首先上官网http://www.or ...
- vs2013的安装及单元测试
一:安装 废了九牛二虎之力,VS终于安装成功,可喜可贺,期间经历了各种风风雨雨,什么安装完少东西啊,重新安装又提示已经安装啊,卸载卸不干净啊,最后只能还原系统重新安装,最后终于成功了,这辈子没见过这么 ...
- robotframework运行时后台报错UnicodeDecodeError
win10环境下报错: Traceback (most recent call last): File "C:\Python27\lib\site-packages\robotide\con ...