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
一行表示答案。
Input示例
3 30
0 1 1 0
1 2 3
Output示例
28
分析:挺好的一道题.
   先想想问题的简化版:不是求平方和,而是求和该怎么做. 肯定是不能枚举子集进行统计的. 二进制上的每一位都是独立的,如果是求最值,可以从高位到低位依次考虑,如果是求和,可以求出每一位是1的方案数,如果第i位为1,那么它对答案的贡献就是2^i * 第i位为1的方案数.
   另f[i][0/1]表示前i个数中,当前枚举的第j位为1的方案数.每个数都有选和不选两种选择. 最后的答案就是Σf[n][1] * 2^j
   如果是求平方和怎么办呢?(a1 + a2 + a3 +...... + an) ^ 2拆开来可以得到:a1 ^ 2 + a2 ^ 2 + a3 ^ 3 + ...... + an^2 + 2a1a2 + 2a1a3 + ...... + 2a1an + ...... + an-1an.每一项都与两位有关. 那么可以枚举两位j,k,求使得第j位和第k位都为1的方案数,它对答案的贡献就是2^(j+k) * 方案数,状态就要表示为f[i][0/1][0/1]了.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll;
const ll mod = 1e9+,maxn = ;
ll n,p,a[][],b[maxn],f[maxn][][],ans; void Mod(ll &x)
{
if (x >= mod)
x -= mod;
} ll solve(ll x,ll y)
{
memset(f,,sizeof(f));
for (ll i = ; i <= n; i++)
{
ll t1 = (b[i] >> x) & ;
ll t2 = (b[i] >> y) & ;
f[i][t1][t2]++;
Mod(f[i][t1][t2]);
}
for (ll i = ; i <= n; i++)
{
ll t1 = (b[i] >> x) & ;
ll t2 = (b[i] >> y) & ;
for (ll j = ; j <= ; j++)
for (ll k = ; k <= ; k++)
{
f[i][j][k] += f[i - ][j][k];
Mod(f[i][j][k]);
f[i][a[j][t1]][a[k][t2]] += f[i - ][j][k];
Mod(f[i][a[j][t1]][a[k][t2]]);
}
}
return f[n][][];
} int main()
{
scanf("%lld%lld",&n,&p);
for (ll i = ; i <= ; i++)
for (ll j = ; j <= ; j++)
scanf("%lld",&a[i][j]);
for (ll i = ; i <= n; i++)
scanf("%lld",&b[i]);
for (ll i = ; i < p; i++)
for (ll j = ; j < p; j++)
{
ll temp = (1LL << (i + j)) % mod * solve(i,j) % mod;
ans += temp;
Mod(ans);
}
printf("%lld\n",ans); return ;
}
   

51nod 1684 子集价值的更多相关文章

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

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

  2. [51nod1684]子集价值

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

  3. 51NOD 区间的价值 V2

    http://www.51nod.com/contest/problem.html#!problemId=1674 因为题目要求的只是& 和 | 这两个运算.而这两个运算产生的值是有限的. & ...

  4. 51nod 1564 区间的价值 | 分治 尺取法

    51nod 1564 区间的价值 题面 一个区间的价值是区间最大值×区间最小值.给出一个序列\(a\), 求出其中所有长度为k的子区间的最大价值.对于\(k = 1, 2, ..., n\)输出答案. ...

  5. 【51Nod 1674】【算法马拉松 19A】区间的价值 V2

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1674 对区间分治,统计\([l,r]\)中经过mid的区间的答案. 我的 ...

  6. 【51nod】1564 区间的价值

    题解 这个要注意到一个长度大的区间的最大价值一定比长度小的区间的价值要大 然后我们以每个点为最小值,显然区间越长最大值越大,然后我们更新最大区间长度的取值,这个可以用单调栈求这个最小值能更新到的左右端 ...

  7. 51nod 1674 区间的价值V2(思维+拆位+尺取法)

    最近被四区题暴虐... 题意:lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积. 例如3个数2,3,6.它们and起来的值为2,or起来的值 ...

  8. 【51Nod 1616】【算法马拉松 19B】最小集合

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1616 这道题主要是查询一个数是不是原有集合的一个子集的所有数的gcd. ...

  9. 51nod 1622 集合对[算法马拉松19 C]

    题目链接:https://www.51nod.com/contest/problem.html#!problemId=1622 第一次参加算法马拉松,我就是去看大神们疯狂秒题,然后感受绝望的orz.. ...

随机推荐

  1. 《Node.js核心技术教程》学习笔记

    <Node.js核心技术教程>TOC \o "1-3" \h \z \u 1.章模块化编程 2019.2.19 13:30' PAGEREF _101 \h 1 08D ...

  2. HBASE理论篇

    1.Hbase是什么 HBase是一种构建在HDFS之上的分布式.面向列的存储系统.在需要实时读写.随机访问超大规模数据集时,可以使用HBase. 尽管已经有许多数据存储和访问的策略和实现方法,但事实 ...

  3. eos对数据库的操作

    eosio的multi_index 概述 multi_index是eosio上的数据库管理接口,通过eosio::multi_index智能合约能够写入.读取和修改eosio数据库的数据 multi_ ...

  4. 20181023-10 Alpha阶段第2周/共2周 Scrum立会报告+燃尽图 07

    作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2290 Scrum master:范靖旋 一.小组介绍 组长:王一可 组员: ...

  5. php addslashes和stripslashes函数

    addslashes — 使用反斜线引用字符串 stripslashes — 反引用一个引用字符串   Example #1 一个 addslashes() 例子 <?php$str = &qu ...

  6. nginx 二进制安装

    Nginx的安装方法 1:yum安装 默认是1.6版本,且在epel源中   2:源码包编译安装 源码下载:http://nginx.org/en/download.html,下载1.8稳定版本   ...

  7. PAT 甲级 1027 Colors in Mars

    https://pintia.cn/problem-sets/994805342720868352/problems/994805470349344768 People in Mars represe ...

  8. Ubuntu 16.04出现:Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/

    转自:http://blog.csdn.net/zzq123686/article/details/77454066 出现错误信息: Reading package lists... Done E:  ...

  9. centos中apache自用常用额外配置记录(xwamp)

    xwamp套件中apache配置,记录下,以免忘记. 配置路径 ${wwwroot_dir}/conf/httpd.conf 配置内容 <ifmodule mod_deflate.c> D ...

  10. 第97天:CSS3渐变和过渡详解

    一.渐变 渐变是CSS3当中比较丰富多彩的一个特性,通过渐变我们可以实现许多炫丽的效果,有效的减少图片的使用数量,并且具有很强的适应性和可扩展性. 可分为线性渐变.径向渐变 1. 线性渐变 (grad ...