题目链接

\(Description\)

给定长为\(n\)的数组\(c_i\)和\(m\),求长为\(n\)的序列\(a_i\)个数,满足:\(c_i\not\mid a_i,\quad a_i\&a_{i+1}=0\)。

\(n\leq 50,m\leq 15,0\leq a_i<2^m,0<c_i\leq 2^m\)。

\(Solution\)

DP。限制都是与值有关的,所以令\(f_i\)表示以\(i\)这个数结尾的序列\(a\)的个数。

转移即\(f_i=\sum_{j,i\&j=0}f_j\)。\(i\&j=0\)需要\(3^n\)枚举补集的子集,但是还可以把它写成\(i\&(\sim j)=i\),即\(i\)是\(\sim j\)的子集。

所以先把上一次的DP数组下标反转,就可以用高维前缀和优化枚举超集了。

对于\(c_i\not\mid a_i\)的限制,每次转移完将下标为\(c_i\)倍数的\(f_i\)置为\(0\)即可。

这样转移\(n\)次就可以了。复杂度\(O(nm2^m)\)。


反转下标的那种写法好骚啊。。

还有枚举子集的方法表示不知道为什么对。。:http://www.cnblogs.com/zwfymqz/p/9911351.html


记一下(我知道的)高维前缀和的两种形式:

for (int j = 0; j < m; ++j)//必须先枚举这个 //求超集的和
for (int s = 0; s < 1<<m; ++s)
if (!(s >> j & 1)) f[s] += f[s | (1 << j)]; for (int j = 0; j < m; j++)//子集卷积
for (int s = 0; s < 1<<m; ++s)
if (s >> j & 1) f[s] += f[s ^ (1 << j)]);

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define mod 1000000000
#define Add(x,v) (x+=v)>=mod&&(x-=mod)
typedef long long LL;
const int N=(1<<15)+5; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
} int main()
{
static int f[N],tmp[N]; for(int T=read(); T--; )
{
int n=read(),m=read(),lim=(1<<m)-1;
memset(f,0,sizeof f);
f[0]=1;
for(int i=1; i<=n; ++i)
{
// for(int s=0; s<=lim; ++s) tmp[s^lim]=f[s];
// for(int s=0; s<=lim; ++s) f[s]=tmp[s];
for(int s=0; s<=lim; s+=2) std::swap(f[s],f[s^lim]);
for(int j=0; j<m; ++j)
for(int s=0; s<=lim; ++s)
if(!(s>>j&1)) Add(f[s],f[s|(1<<j)]);
int ci=read();
for(int j=0; j<=lim; j+=ci) f[j]=0;
}
LL ans=0;
for(int i=0; i<=lim; ++i) ans+=f[i];
printf("%d\n",(int)(ans%mod));
}
return 0;
}

SPOJ.TLE - Time Limit Exceeded(DP 高维前缀和)的更多相关文章

  1. SPOJ Time Limit Exceeded(高维前缀和)

    [题目链接] http://www.spoj.com/problems/TLE/en/ [题目大意] 给出n个数字c,求非负整数序列a,满足a<2^m 并且有a[i]&a[i+1]=0, ...

  2. TLE - Time Limit Exceeded

    TLE - Time Limit Exceeded no tags  Given integers N (1 ≤ N ≤ 50) and M (1 ≤ M ≤ 15), compute the num ...

  3. codeforces 938F(dp+高维前缀和)

    题意: 给一个长度为n的字符串,定义$k=\floor{log_2 n}$ 一共k轮操作,第i次操作要删除当前字符串恰好长度为$2^{i-1}$的子串 问最后剩余的字符串字典序最小是多少? 分析: 首 ...

  4. HDU.5765.Bonds(DP 高维前缀和)

    题目链接 \(Description\) 给定一张\(n\)个点\(m\)条边的无向图.定义割集\(E\)为去掉\(E\)后使得图不连通的边集.定义一个bond为一个极小割集(即bond中边的任意一个 ...

  5. 【洛谷5643】[PKUWC2018] 随机游走(Min-Max容斥+待定系数法+高维前缀和)

    点此看题面 大致题意: 从一个给定点出发,在一棵树上随机游走,对于相邻的每个点均有\(\frac 1{deg}\)的概率前往.多组询问,每次给出一个点集,求期望经过多少步能够访问过点集内所有点至少一次 ...

  6. LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望

    传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...

  7. cf449D. Jzzhu and Numbers(容斥原理 高维前缀和)

    题意 题目链接 给出\(n\)个数,问任意选几个数,它们\(\&\)起来等于\(0\)的方案数 Sol 正解居然是容斥原理Orz,然而本蒟蒻完全想不到.. 考虑每一种方案 答案=任意一种方案 ...

  8. EOJ-3300 奇数统计(高维前缀和)

    题目链接: https://acm.ecnu.edu.cn/problem/3300/ 题目大意: 给n个数,求在n个数中选两个数(可重复),使得这两个数的组合数是奇数,求总共有多少种取法. 解题思路 ...

  9. Codeforces 449D Jzzhu and Numbers(高维前缀和)

    [题目链接] http://codeforces.com/problemset/problem/449/D [题目大意] 给出一些数字,问其选出一些数字作or为0的方案数有多少 [题解] 题目等价于给 ...

随机推荐

  1. java----Java的栈,堆,代码,静态存储区的存储顺序和位置

    转载:https://blog.csdn.net/zhangbaoanhadoop/article/details/82193497

  2. 关于JDBC的总结

    1. Spring JDBC子框架是什么 答:就是一个Spring框架内置的持久层框架.既然是一个持久层框架,作用就是对数据库增删改查!! 2. SpringJDBC是使用声明类操作数据库的? 答:J ...

  3. jQuery 常用的方法

    <!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...

  4. python selenium-webdriver 生成测试报告

    测试最后的一个重要的过程就是生成一份完整的测试报告,生成测试报告的主要是通过python的一个第三方模块HTMLTestRunner.py生成,但是生成的测试报告不是特别的美观,而且没有办法统计测试结 ...

  5. 步步为营-76-用户登录(Session+Cookie)

    说明:cookie是保存在浏览器的.Session是存储在服务器的 1 同样UI页面还是web前端提供 1.1 首先,经过验证码校验:将系统产生的验证码放入到Session中,然后取Session值注 ...

  6. PV-UV-QPS

    QPS:每秒查询率(Query Per Second) ,每秒的响应请求数,也即是最大吞吐能力.QPS = req/sec = 请求数/秒QPS统计方式 [一般使用 http_load 进行统计]QP ...

  7. Caused by: java.lang.ClassNotFoundException: Didn't find class "io.grpc.helloworldexample.HelloworldActivity" on path: DexPathList

    FAQ:  Android app 编译好后安装到手机,运行时闪退,报如下错误: java.lang.RuntimeException: Unable to instantiate activity ...

  8. Oracle亿级数据查询处理(数据库分表、分区实战)

    大数据量的查询,不仅查询速度非常慢,而且还会导致数据库经常宕机(刚接到这个项目时候,数据库经常宕机o(╯□╰)o). 那么,如何处理上亿级的数据量呢?如何从数据库经常宕机到上亿数据秒查?仅以此篇文章作 ...

  9. es6 新增数据类型Symbol

    es6在string number boolean null undefined object之外又新增了一种Symbol类型. Symbol意思是符号,有一个特性—每次创建一个Symbol值都是不一 ...

  10. 一起学Hadoop——二次排序算法的实现

    二次排序,从字面上可以理解为在对key排序的基础上对key所对应的值value排序,也叫辅助排序.一般情况下,MapReduce框架只对key排序,而不对key所对应的值排序,因此value的排序经常 ...