Oier们的镜子(mirror)
题解:
这题真是把我坑的很惨。。
题目看了很久才看懂。。
然后刚开始又没看见每个只能匹配一个这种条件
#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
const int N=;
const int N2=<<;
int n,f[N][N2],g[N2],q[N],C[][],a[N];
const int mo=;
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n;
rep(i,,n) cin>>a[i];
sort(a+,a+n+);
int lst=;
rep(i,,)
rep(j,,i)
if (j==i||j==) C[i][j]=;
else C[i][j]=C[i-][j]+C[i-][j-];
f[][]=;
rep(i,,n)
{
if (a[i]==a[i+]) continue;
rep(k,,i-lst)
{
rint now=;
rep(j,,k)
now^=<<(i-j);
rint l=(<<lst)-;
rep(j,,l)
if (f[lst][j])
{
int ans1=C[i-lst][k];
int cnt=,ans=;
rep(k,,lst-) if ((j>>k)&) q[++cnt]=k+;
int l2=(<<cnt)-,cnt2=,num=;
rep(k1,,l2)
{
if (k1>>(cnt2+)) cnt2++;
g[k1]=g[k1^(<<cnt2)]+a[q[cnt2+]];
if (g[k1]==a[i]) num++;
}
ans1=1ll*ans1*f[lst][j]%mo;
ans=1ll*(num+k)%mo;
rep(p,,i-lst-k) ans1=1ll*ans1*ans%mo;
f[i][j^now]=ans1;
}
}
lst=i;
}
int ans=;
rep(i,,(<<n)-)
ans=(ans+f[n][i])%mo;
cout<<ans<<endl;
return ;
}
然后又思考怎么处理相同元素思考了比较久
我自己写了一种特判相同元素的方法。。。非常复杂。。。(还是看错题目的),之后就没改了
大致就是枚举这些元素里哪些是镜子,哪些是由东西组合的,然后再乘组合数再乱搞。。
首先这道题目状压dp是比较显然的
排序也是比较显然的
然后唯一的问题在于相同元素怎么办
有一个非常巧妙的办法就是
当f[i][j]通过相同元素转移,那么要把这个东西乘二
为什么呢,我们可以这么理解,如果你要把右边的那个东西当镜子,左边的当元素
那么和左边当镜子,右边当元素方案数是等价的
因为由于这道题的特性每个元素只能对应一个,所以对于这两个元素,有关联的只有互相
// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define lowbit(x) (x&(-x))
const int N=;
const int N2=<<;
int n,a[N],b[N2],sum[N2],f[N][N2];
const int mo=1e9+;
void js(int &x,int y)
{
x+=y;
x%=mo;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
rep(i,,n) cin>>a[i];
sort(a+,a+n+);
rep(i,,n) b[<<(i-)]=a[i];
int l=(<<n)-;
f[][]=;
rep(i,,l) sum[i]=sum[i-lowbit(i)]+b[lowbit(i)];
rep(i,,n)
{
rep(j,,l)
if (f[i-][j])
{
js(f[i][j|(<<(i-))],f[i-][j]);
for(rint k=j;k;k=(k-)&j)
if (sum[k]==a[i])
{
js(f[i][j^k],f[i-][j]);
if (!(k-lowbit(k))) js(f[i][j^k],f[i-][j]);
}
}
}
int ans=;
rep(i,,l) js(ans,f[n][i]);
cout<<ans<<endl;
return ;
}
同学给了我一种新的方法。。
我们可以比较暴力的做
每次枚举一个数,然后枚举子集可以用哪些东西构成
记录一下用了几组,最后除掉就行了
7*3^n并不能过
然后可以用fwt优化
Oier们的镜子(mirror)的更多相关文章
- English trip M1 - AC3 Teacher:Corrine
课堂上内容 16,black,games The clothes is Only $. is lucky number in China. God give us black eyes,but we ...
- websocket可以做什么
本篇介绍的是websocket,但是并不介绍它的协议格式,一般能看明白http头也能明白websocket在协议切换前的协商,能看明白IP报头也就对websocket在协议切换后通讯格式不陌生.web ...
- [codeforces 241]C. Mirror Box
[codeforces 241]C. Mirror Box 试题描述 Mirror Box is a name of a popular game in the Iranian National Am ...
- 几何入门合集 gym101968 problem F. Mirror + gym102082 Problem F Fair Chocolate-Cutting + gym101915 problem B. Ali and Wi-Fi
abstract: V const & a 加速 F. Mirror 题意 链接 问题: 有n个人在y=0的平面上(及xoz平面).z=0平面上有一面镜子(边平行于坐标轴).z=a平面上有q个 ...
- 「HDU - 2857」Mirror and Light(点关于直线的对称点)
题目链接 Mirror and Light 题意 一条直线代表镜子,一个入射光线上的点,一个反射光线上的点,求反射点.(都在一个二维平面内) 题解 找出入射光线关于镜子直线的对称点,然后和反射光线连边 ...
- Unity镜子效果的实现(无需镜子Shader)
Unity镜子效果制作教程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...
- 【Unity Shader】(九) ------ 高级纹理之渲染纹理及镜子与玻璃效果的实现
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ...
- 牛客寒假5-I.炫酷镜子
链接:https://ac.nowcoder.com/acm/contest/331/I 题意: 小希拿到了一个镜子块,镜子块可以视为一个N x M的方格图,里面每个格子仅可能安装`\`或者`/`的镜 ...
- 【论文阅读】Where Is My Mirror?
Where Is My Mirror?(ICCV2019收录) 作者: 论文链接: https://arxiv.org/pdf/1908.09101.pdf 1. 研究背景 目前存在的计算机视觉任务 ...
随机推荐
- 64位程序,利用ADO连接Oracle数据库
刚好手头项目解决了ADO连接Oracle数据库的问题,记录下来,防止忘记. 项目情况:用32位环境完成算法动态库,结果后来需要升级到64位环境,由64位的软件来调用,则在64位设置下生成算法动 ...
- 在Visual Studio里配置及查看IL
原文地址:http://www.myext.cn/other/a_25162.html 在之前的版本VS2010中,在Tools下有IL Disassembler(IL中间语言查看器),但是我想直接集 ...
- SQL Server 2017 安装详解
SQL server 2017下载链接:https://pan.baidu.com/s/1FSzqJfHQAa0QpZ_fObrfjQ 提取码:1xvb 1.双击iso镜像文件 打开setup ...
- LabVIEW-PC-PLC-MCU串口通信-介绍很全
链接:https://pan.baidu.com/s/1dG9nuPN 密码:vnpf
- 【原创】大数据基础之Flume(2)Sink代码解析
flume sink核心类结构 1 核心接口Sink org.apache.flume.Sink /** * <p>Requests the sink to attempt to cons ...
- docker的安装及项目部署
Making Docker and Deployment Process Step: set up your docker environment build a image of activeMQ ...
- Codeforces Educational Codeforces Round 57 题解
传送门 Div 2的比赛,前四题还有那么多人过,应该是SB题,就不讲了. 这场比赛一堆计数题,很舒服.(虽然我没打) E. The Top Scorer 其实这题也不难,不知道为什么这么少人过. 考虑 ...
- 堆(Heap)详解——Java实现
Heap 堆定义:(这里只讲二叉堆)堆实为二叉树的一种,分为最小堆和最大堆,具有以下性质: 任意节点小于/大于它的所有后裔,最小/大元在堆的根上. 堆总是一棵完全二叉树 将根节点最大的堆叫做最大堆或大 ...
- 【MySql】delete用法
delete 语句用于删除表中的数据, 基本用法为: delete from 表名称 where 删除条件; 以下是在表 students 中的实例: 删除 id 为 3 的行: delete fro ...
- (转)scikit-learn主要模块和基本使用方法
从网上看到一篇总结的很不错的sklearn使用文档,备份勿忘. 引言 对于一些开始搞机器学习算法有害怕下手的小朋友,该如何快速入门,这让人挺挣扎的.在从事数据科学的人中,最常用的工具就是R和Pytho ...