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. 使用C#创建WCF服务控制台应用程序

    本文属于原创,转载请注明出处,谢谢! 一.开发环境 操作系统:Windows 10 开发环境:VS2015 编程语言:C# IIS版本:10.0.0.0 二.添加WCF服务.Internet Info ...

  2. 通过Mysql连接ASP.Net Core2.0(Code First模式)

    ASP.NET Core2.0连接Mysql,首先新建项目 选择Web应用程序 选择需要身份验证: 通过Nuget安装Mysql驱动,这里推荐>Pomelo.EntityFrameworkCor ...

  3. Jenkins下载安装

    Jenkins是什么? Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Jenkins可以用于一些测 ...

  4. 查看Python的版本、内建方法和模块等内容的方法

    若想更好地应用Python帮助我们解决日常生活的问题,就必须了解清楚它的内建方法和模块等特性.相信不少同学在安装某个版本的Python后,对于内建方法之类都是一知半解,希望本文能帮助了解Python的 ...

  5. 【转载】kafka 基础知识

    1.       kafka介绍 1.1.       主要功能 根据官网的介绍,ApacheKafka®是一个分布式流媒体平台,它主要有3种功能: 1:It lets you publish and ...

  6. 上云利器,K8S应用编排设计器之快到极致

    前言在前面的文章中,我们已经提到,华为云有一个上云利器:应用编排设计器.作为华为云应用编排服务与用户沟通的桥梁,设计器坚持用户体验至上的理念,以图形化方式,在鼠标点击之间,助力企业快速上云.优质的交互 ...

  7. linux一切皆文件之tty字符设备(深入理解sshd创建pty的过程) (五)

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.块设备支 ...

  8. 手机访问PC端

    输入所要访问的端口,然后默认下一步即可.

  9. 互评Final版本——二次元梦之队——“I Do”

    基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题; (1)N(Need,需求) 当今的许多科技大佬从少年时代就已经开始了自己的编程生涯,我国许多人也意识到了拥有编程能力的 ...

  10. java入门--4110:圣诞老人的礼物-Santa Clau’s Gifts

    学习了一下java的语法,就用poj上的题目做作练习,好更快的熟悉常用的java语法. 题目在这里 http://bailian.openjudge.cn/practice/4110/ import ...