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取模即可。
 Input
  第一行两个整数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)。
 Output
  一行表示答案。

  发现没法按位算贡献..然后就不会写了。

  看题解才发现自己tooyoung

考虑答案的形式,假设一个子集经过题目中描述的位运算之后值为x,那么这个子集对答案的贡献为x^2。

我们将x分解是二的幂次,若x&(1<<i)为0,则xi=0,否则xi=(1<<i)。
那么我们将x^2分解后可以得到如下形式(x0+x1+...xp-1)^2。
分解上式得到x0^2+x0x1+...+x0xk-1+x1x0+x1^2+...+x1xp-1+...+。
我们发现这个式子中最多只与两个位有关。
因此我们可以递推。
枚举i和j,表示选择了b中的第i位和第j位,令dp[0/1][0/1]表示通过lyk所给的新的位运算后,到当前枚举的位置,第i位为0/1,第j位为0/1的方案总数。
那么最后将2^(i+j)乘上dp[1][1]就是对答案的贡献了。
只需将这些贡献累计起来就是答案了。
总复杂度为p^2n。
 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<bitset>
//#include<ctime>
#define ll long long
#define ull unsigned long long
#define ui unsigned int
#define d double
//#define ld long double
using namespace std;
const int maxn=,modd=;
int f[][][],a[maxn];
bool to[][];
int i,j,k,n,m,p; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while((rx<''||rx>'')&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>=''&&rx<='')ra=ra*+rx-,rx=getchar();return ra*fh;
} inline void M(int &x){if(x>=modd)x-=modd;}
inline int get(int p1,int p2){
bool now=,pre=,n1,n2;
f[pre][][]=/*1,*/f[pre][][]=f[pre][][]=f[pre][][]=;
for(register int i=;i<=n;i++,swap(now,pre))
n1=(a[i]>>p1)&,n2=(a[i]>>p2)&,
memcpy(f[now],f[pre],<<),M(++f[now][n1][n2]),
M(f[now][to[][n1]][to[][n2]]+=f[pre][][]),
M(f[now][to[][n1]][to[][n2]]+=f[pre][][]),
M(f[now][to[][n1]][to[][n2]]+=f[pre][][]),
M(f[now][to[][n1]][to[][n2]]+=f[pre][][]);
return f[pre][][];
}
int main(){
n=read(),p=read();
for(i=;i<;i++)for(j=;j<;j++)to[i][j]=read();
for(i=;i<=n;i++)a[i]=read();
int ans=;
for(i=;i<p;i++)for(j=;j<p;j++)ans=(ans+ 1ll*(1ll<<(i+j))%modd*get(i,j))%modd;
printf("%d\n",ans);
}

[51nod1684]子集价值的更多相关文章

  1. 51Nod 1684 子集价值 (平方和去括号技巧)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1684 题意: 新建一个位运算,求所有子集通过这个位运算后的答案的平方和是 ...

  2. 51nod 1684 子集价值

    lyk最近在研究位运算. 它发现除了xor,or,and外还有很多运算. 它新定义了一种运算符“#”. 具体地,可以由4个参数来表示. ai,j表示 i#j. 其中i,j与a的值均∈[0,1]. 当然 ...

  3. C语言不是C++的严格子集

    C语言是C++的子集吗?C++是在C语言的基础上扩展而来并包含所有C语言的内容吗? 回复: 从实用角度讲,C++属于C语言的一个超集,基本上兼容ANSI C.但是从编译角度上讲,C语言的有些特性在C+ ...

  4. Equipment UVA - 1508(子集补集)

    The Korea Defense and Science Institute, shortly KDSI, has been putting constant effort into newequi ...

  5. python 回溯法 子集树模板 系列 —— 3、0-1背包问题

    问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大? 分析 显然,放入背包的物品,是N个物品的所有子集的其 ...

  6. 傻瓜方法求集合的全部子集问题(java版)

    给定随意长度的一个集合.用一个数组表示,如{"a", "b","c"},求它的全部子集.结果是{ {a}, {b}, {c}, {a,b}, ...

  7. 牛客练习赛49 B 筱玛爱阅读 (状压DP,子集生成)

    链接:https://ac.nowcoder.com/acm/contest/946/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262875K,其他语言5257 ...

  8. (容量超大)or(容量及价值)超大背包问题 ( 折半枚举 || 改变 dp 意义 )

    题意 : 以下两个问题的物品都只能取有且只有一次 ① 给你 N 个物品,所有物品的价值总和不会超过 5000, 单个物品的价格就可达 10^10 ,背包容量为 B ② 给你 N (N ≤ 40 ) 个 ...

  9. 背包,子集和以及 (max, +) 卷积在特殊情形下的求法

    背包,子集和以及 (max, +) 卷积在特殊情形下的求法 子集和 1:总重量不太大 有 \(n\) 个物品,每个物品重量为 \(w_i\),且 \(\sum\limits_{i} w_i=C\).你 ...

随机推荐

  1. 用VS2015写一个简单的ASP.net网站

    第一步:打开VS2015,然后新建一个空的解决方案,其中解决方案的名称WebSiteTest可类似认为是本次网站的名称,系统会以该名称(WebSiteTest)生成一个文件夹,在WebSites文件夹 ...

  2. xml文件解析(使用解析器)

    一.Xml解析,解析xml并封装到list中的javabean中 OM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在 ...

  3. 如何安装mysql

    如何安装mysql对于初学者来说的确是很麻烦,首先要知道安装mysql仅仅只是安装一个mysql系统,是没有任何可视化操作界面的,所以还要安装一个mysql的管理工具,这是初学者容易蒙的地方之一. m ...

  4. 1-安装MQTT服务器(Windows)

    对于不知道MQTT的肯定会问MQTT是干什么的....... 现在我有一个项目需求, 看到这个项目第一想法肯定需要一个服务器,所有的wifi设备和手机都去连接这个服务器,然后服务器进行信息的中转,类似 ...

  5. IT小白学习Discuz!框架(一)

    1.Discuz!是什么? 答:(1).Crossday Discuz! Board(简称 Discuz!)是北京康盛新创科技有限责任公司推出的一套通用的社区论坛软件系统. (2).Crossday ...

  6. 微信公众号开发——通过ffmpeg解决amr文件无法播放问题

    今天刚好碰到个需求,要在微信浏览器中实现录音,并在其他页面上播放.录音功能本身是JS SDK的功能,倒没啥问题,然而录音的文件保存下来是amr格式,而IOS的浏览器没法播放amr(据说微信浏览器的vi ...

  7. Jmeter 创建FTP测试计划

    FTP服务主要提供上传和下载功能. 操作步骤: 1.创建一个线程组 2.线程组--->添加--->配置元件--->FTP请求缺省值:输入服务器名称或IP. 3.线程组--->添 ...

  8. SQL语言的分类

    本文转自https://www.cnblogs.com/fjfzhkb/archive/2007/10/18/929108.html SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML, ...

  9. jQuery 效果函数(三)

    方法 描述 animate() 对被选元素应用“自定义”的动画 clearQueue() 对被选元素移除所有排队的函数(仍未运行的) delay() 对被选元素的所有排队函数(仍未运行)设置延迟 de ...

  10. css实现椭圆、半椭圆

    一.自适应的椭圆 1. 椭圆 css .ellipse{ width: 250px; height: 150px; margin: 50px; background: #FFD900; border- ...