http://uoj.ac/problem/300

预备知识:

C(n,m)是奇数的充要条件是 n&m==m

由卢卡斯定理可以推出

选出的任意相邻两个数a,b 的组合数计算C(a,b)必须是奇数

所以可以设dp[i][j] 表示前i个数里面,选的最后一个数是第j个数的方案数

转移的时候,枚举前i-1个数选的最后一个数k,

若C(k,i)是奇数,dp[i][j]+=dp[i-1][k]

时间复杂度:O(n^3)

#include<cstdio>
#include<iostream> using namespace std; #define N 20 const int mod=1e9+; int a[N]; int dp[N][N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} bool judge(int x,int y)
{
if(!x) return true;
return (x&y)==y;
} int main()
{
int n;
read(n);
for(int i=;i<=n;++i) read(a[i]);
dp[][]=;
for(int i=;i<=n;++i)
for(int j=;j<=i;++j)
{
dp[i][j]=;
for(int k=;k<j;++k)
if(judge(a[k],a[j]))
{
dp[i][j]+=dp[i-][k];
dp[i][j]-=dp[i][j]>=mod ? mod : ;
}
}
int ans=;
for(int i=;i<=n;++i)
{
ans+=dp[n][i]-;
ans-=ans>=mod ? mod : ;
}
printf("%d",ans);
}

优化:

dp[i] 表示选的最后一个数是第i个数的方案数

枚举前面的i-1个数,

若C(a[i],a[j])是奇数,dp[i]+=dp[j]

时间复杂度:O(n^2)

#include<cstdio>
#include<iostream> using namespace std; #define N 2018 const int mod=1e9+; int a[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 main()
{
int n;
read(n);
for(int i=;i<=n;++i) read(a[i]);
for(int i=;i<=n;++i) dp[i]=;
for(int i=;i<=n;++i)
{
for(int j=;j<i;++j)
if((a[j]&a[i])==a[i]) dp[i]+=dp[j];
}
int ans=;
for(int i=;i<=n;++i)
{
ans+=dp[i]-;
ans-=ans>=mod ? mod : ;
}
printf("%d",ans);
}

再优化:

dp[i] 表示选的最后一个数是i的方案数

dp[i] 能转移到i的子集,

所以枚举子集j,若j在i的后面,那么dp[j]+=dp[i]

时间复杂度:O(3^(logn))

#include<cstdio>
#include<iostream> using namespace std; #define N 233334 const int mod=1e9+; int a[N]; int dp[N];
int pos[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int main()
{
int n;
read(n);
for(int i=;i<=n;++i) read(a[i]),pos[a[i]]=i;
int bit,sum;
for(int i=;i<=n;++i)
{
dp[a[i]]++;
for(int j=(a[i]-)&a[i];j;j=(j-)&a[i])
if(pos[j]>i)
{
dp[j]+=dp[a[i]];
dp[j]-=dp[j]>=mod ? mod : ;
}
}
int ans=;
for(int i=;i<=n;++i)
{
ans+=dp[a[i]]-;
ans-=ans>=mod ? mod : ;
}
printf("%d",ans);
}

常数优化:

边读入边计算,接着累计进答案

就可以不用判断子集是否在i的后面

因为在前面的话,前面的已经累积进答案了

#include<cstdio>
#include<iostream> using namespace std; #define N 233334 const int mod=1e9+; int a[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 main()
{
int n,x;
int ans=;
read(n);
for(int i=;i<=n;++i)
{
read(x);
dp[x]++;
for(int j=(x-)&x;j;j=(j-)&x)
{
dp[j]+=dp[x];
dp[j]-=dp[j]>=mod ? mod : ;
}
ans+=dp[x]-;
ans-=ans>=mod ? mod : ;
}
printf("%d",ans);
}

bzoj千题计划247:bzoj4903: [Ctsc2017]吉夫特的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  3. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  4. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  5. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  6. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  7. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

  8. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

  9. bzoj千题计划250:bzoj3670: [Noi2014]动物园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...

随机推荐

  1. dubbo见解

    调用关系说明 服务容器负责启动,加载,运行服务提供者. 服务提供者在启动时,向注册中心注册自己提供的服务. 服务消费者在启动时,向注册中心订阅自己所需的服务. 注册中心返回服务提供者地址列表给消费者, ...

  2. effective c++ 笔记 (49-52)

    //---------------------------15/04/27---------------------------- //#49   了解new-handler的行为 { /* 1:在o ...

  3. centos 7 tomcat 开机自启

    第一章 1.将tomcat加入开启自己,以减少手动启动的麻烦 环境配置需要提前配置好.(我这里已经是不做操作了) 192.168.1.195 jdk1.8 +  tomcat 8 第二章 2.编写to ...

  4. python中列表的常用操作增删改查

    1. 列表的概念,列表是一种存储大量数据的存储模型. 2. 列表的特点,列表具有索引的概念,可以通过索引操作列表中的数据.列表中的数据可以进行添加.删除.修改.查询等操作. 3. 列表的基本语法 创建 ...

  5. 转 git config命令使用

    . git config简介 我们知道config是配置的意思,那么git config命令就是对git进行一些配置.而配置一般都是写在配置文件里面,那么git的配置文件在哪里呢?互动一下,先问下大家 ...

  6. c语言数字图像处理(二):图片放大与缩小-双线性内插法

    图像内插 假设一幅大小为500 * 500的图像扩大1.5倍到750 * 750,创建一个750 * 750 的网格,使其与原图像间隔相同,然后缩小至原图大小,在原图中寻找最接近的像素(或周围的像素) ...

  7. 论文阅读 | Clustrophile 2: Guided Visual Clustering Analysis

    论文地址 论文视频 左侧边栏可以导入数据,或者打开以及前保存的结果.右侧显示了所有的日志,可以轻松回到之前的状态,视图的主区域上半部分是数据,下半部分是聚类视图. INTRODUCTION 数据聚类对 ...

  8. java中多态的实现机制

    多态的概念: 简单来说就是事物在运行过程中存在的不同状态,即父类或接口定义的引用变量指向子类或具体实现类的实例对象.程序调用方法在运行期才进行动态绑定,而不是引用变量的类型中定义的方法. 多态存在的前 ...

  9. 树形DP ---- Codeforces Global Round 2 F. Niyaz and Small Degrees引发的一场血案

    Aspirations:没有结果,没有成绩,acm是否有意义?它最大的意义就是让我培养快速理解和应用一个个未知知识点的能力. ————————————————————————————————————— ...

  10. node 随便升级到最新版本的遭遇

    将node 升级到最新版本后,创建一个RN新项目,执行:react-native init AwesomeProject  遇到: error An unexpected error occurred ...