SPOJ Time Limit Exceeded(高维前缀和)

【题目链接】 http://www.spoj.com/problems/TLE/en/

【题目大意】

  给出n个数字c,求非负整数序列a,满足a<2^m
  并且有a[i]&a[i+1]=0,对于每个a[i],要保证a[i]不是c[i]的倍数,
  求这样的a[i]序列的个数

【题解】

  我们用dp[i]表示以i为结尾的方案数,
  我们发现要满足a[i]&a[i+1]=0,则dp[i]是从上一次结果中所有满足i&j=0的地方转移过来的
  i&j=0即i&(~j)=i,即i为~j的子集,那么我们每次对上一次的结果进行下标取反操作,
  那么求当前dp[i],就是求出以i为子集的上一次计算出的dp值的高维前缀和。
  对于c[i]这个条件,我们每轮计算后将c[i]倍数为下标的dp值置0即可。

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int T,n,m,c[100];
const int mod=1000000000;
struct data{
    int val;
    data operator +(const data &rhs)const{
        int t_val=val+rhs.val;
        if(t_val>=mod)t_val-=mod;
        if(t_val<0)t_val+=mod;
        return data{t_val};
    }
}dp[(1<<15)+10],res;
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%d",&c[i]);
        int all=1<<m;
        for(int j=0;j<all;j++)dp[j].val=(j==0);
        for(int i=1;i<=n;i++){
            for(int j=0;j<all;j+=2)swap(dp[j],dp[j^(all-1)]);
            for(int j=0;j<m;j++)for(int k=0;k<all;k++){
                if(~k&(1<<j))dp[k]=dp[k]+dp[k|(1<<j)];
            }for(int j=0;j<all;j+=c[i])dp[j].val=0;
        }res.val=0;
        for(int j=0;j<all;j++)res=res+dp[j];
        printf("%d\n",res.val);
    }return 0;
}
时间: 2024-08-26 06:41:34

SPOJ Time Limit Exceeded(高维前缀和)的相关文章

JVM运行报错:GC overhead limit exceeded

今天在折腾OOM和java的4种引用类型的时候,在运行过程中JVM报了一个错误: java.lang.OutOfMemoryError: GC overhead limit exceeded 这个错误平时遇到的概率很少很少,今天无意中遇到了,这里做个记录.oracle/sun官网的解释是: The concurrent collector will throw an OutOfMemoryError if too much time is being spent in garbage colle

4.7-4.9补题+水题+高维前缀和

题目链接:51nod 1718 Cos的多项式  [数学] 题解: 2cosx=2cosx 2cos2x=(2cosx)^2-2 2cos3x=(2cosx)^3-3*(2cosx) 数归证明2cos(nx)能表示成关于2cosx的多项式,设为f(n) f(1)=x,f(2)=x^2-2(其中的x就是2cosx) 假设n=1~k时均成立(k>=3) 当n=k+1时 由cos((k+1)x)=cos(kx)cos(x)-sin(kx)sin(x) cos((k-1)x)=cos(kx)cos(x)

Unhandled event loop exception GC overhead limit exceeded

1.错误描述 java.lang.OutOfMemoryError: GC overhead limit exceeded at java.util.zip.ZipFile.<init>(ZipFile.java:466) at java.util.zip.ZipFile.<init>(ZipFile.java:145) at java.util.zip.ZipFile.<init>(ZipFile.java:159) at org.eclipse.jdt.intern

java.lang.OutOfMemoryError:GC overhead limit exceeded

之所以写下来,是因为不想在下次遇到事有到处找,很多时候错误信息一样,但是导致的原因却有很多. 我试驾了一个虚拟机启动采纳数:-XX:-UseGCOverheadLimit 把原文链接写上,标示感谢: http://www.cnblogs.com/hucn/p/3572384.html 我遇到这样的问题,本地部署时抛出异常java.lang.OutOfMemoryError:GC overhead limit exceeded导致服务起不来,查看日志发现加载了太多资源到内存,本地的性能也不好,gc

排查java.lang.OutOfMemoryError: GC overhead limit exceeded

帮助客户排查java.lang.OutOfMemoryError: GC overhead limit exceeded错误记录: 具体网址: https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=269134815562958&id=1554559.1&displayIndex=2&_afrWindowMode=0&_adf.ctrl-state=2t8bqbn6s_165 文档id: 155455

hihocoder1496(高维前缀和)

题意:给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大.其中AND是按位与操作. 第一行一个整数N(1<=N<=100,000) 第二行N个整数A1, A2, A3, ... AN (0 <= Ai <2^20) 分析: 尝试枚举and值z,那么问题就变成了找寻最大的x*y,使得x&y==z 把这个要求放宽一点,我们来寻找z是x&y子集的情况(这样肯定不会丢掉整体最优

[Hadoop] - Hadoop Mapreduce Error: GC overhead limit exceeded

在运行mapreduce的时候,出现Error: GC overhead limit exceeded,查看log日志,发现异常信息为 2015-12-11 11:48:44,716 FATAL [main] org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.OutOfMemoryError: GC overhead limit exceeded at java.io.DataInputStream.readU

Spark 1.4.1中Beeline使用的gc overhead limit exceeded

最近使用SparkSQL做数据的打平操作,就是把多个表的数据经过关联操作导入到一个表中,这样数据查询的过程中就不需要在多个表中查询了,在数据量大的情况下,这样大大提高了查询效率. 我启动了thriftserver,然后通过beeline去连接thriftserver, 打平操作进行的很顺利,但是在执行groupby操作的时候beeline报了一个错误:gc overhead limit exceeded 我分析可能是thriftserver报的错误.但是查看了thriftserver的日志没有任

ora-16038:日志无法归档 ora-00312 ORA-19809: limit exceeded for recovery files ora-19804

ORA-03113:通信通道的文件结尾 进程ID4781 查看alter.log 发现提示联机日志文件有问题 网上的方法看不是很懂,看到有很多错误 ora-16038:日志无法归档 ora-00312 ORA-19809: limit exceeded for recovery files ora-19804:无法回收...磁盘空间 原来Oracle11g在默认情况下,归档日志是保存在闪存恢复区的,并且闪存恢复区的大小默认是2g,空间满了之后就没有办法再归档了. 启动数据库到mount状态,st