bzoj千题计划247:bzoj4903: [Ctsc2017]吉夫特
预备知识:
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]吉夫特的更多相关文章
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...
- bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹
http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...
- bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机
http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...
- bzoj千题计划250:bzoj3670: [Noi2014]动物园
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...
随机推荐
- LeetCode Merge k Sorted Lists (链表)
题意 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity ...
- web项目_学生证管理系统
项目简述: 基于java web实现学生卡管理系统,用户包括学生和学生处,分别实现以下功能. 学生: 1.对本人登录密码的修改 2.申请补办学生卡 3.查看学生卡补办状态 学生处: 1.对学生信息的管 ...
- 阿里云ESC入网和出网指的什么
什么是入网带宽和出网带宽 云服务器 ECS 的入网带宽和出网带宽皆以服务器角度出发.下表给出了入网带宽和出网带宽的具体内容: 带宽类别 (Mbit/s) 描述 入网带宽 流入云服务器 ECS 的带宽从 ...
- 开源一个最近写的spring与mongodb结合的demo(spring-mongodb-demo)
由于工作需要,给同事们分享了一下mongodb的使用,其中主要就是做了一个spring-data+mongodb的小例子,本着分享的精神,就上传到了github.com上,有需要的同学请移步githu ...
- JavaScript中执行环境和栈
在这篇文章中,我会深入理解JavaScript最根本的组成之一 : "执行环境(执行上下文)".文章结束后,你应该对解释器试图做什么,为什么一些函数/变量在未声明时就可以调用并且他 ...
- mysql学习(1)
开始我们基础的mysql学习 第一部分:补充知识 1. 昨天讲到的mysql初始化密码为空,今天又get到一种新的方法 Mysql安装后需要做的 Mysql安装成功后,默认的root用户密码为空,你可 ...
- LeetCode 70. Climbing Stairs爬楼梯 (C++)
题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...
- 读书笔记(chapter1-2)
一.linux内核简介 1.1unix的历史 1.unix强大的根本原因:1.unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目的:2.在unix中,所有的东西都被当作文件对待:3.un ...
- blob下载出现多余乱码内容
blob需要单独获取,,不能通过map来获取 jdbcTemplate.query(sqlcontent, new Object[] {id}, new AbstractLobStreamin ...
- GitHub和Microsoft TFS对比有什么优势
GitHub变得越来越流行,最近Github发布了Github for Windows则大大降低了学习成本和使用难度,它甚至优于TFS. 微软也开始逐渐从TFS向GitHub转移了. 不是 TFS 输 ...