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. 研究背景 目前存在的计算机视觉任务 ...
随机推荐
- C++、VC++、MFC网页自动注册、登陆、发帖、留言,QQ注册、QQ申请器源码、注册邮箱源码、自动发帖源码
C++.VC++.MFC网页自动注册.登陆.发帖.留言,QQ注册.QQ申请器源码.注册邮箱源码.自动发帖源码 参考资料: 自动登录yahoo邮箱http://blog.csdn.net/suisu ...
- u3d常用代码小集合
01.基本碰撞检测代码 function OnCollisionEnter(theCollision : Collision){ if(theCollision.gameObject.name == ...
- C++ 三/五法则
当定义一个类时,我们显式地或隐式地指定了此类型的对象在拷贝.赋值和销毁时做什么.一个类通过定义三种特殊的成员函数来控制这些操作:拷贝构造函数.拷贝赋值运算符和析构函数. 拷贝构造函数定义了当用同类型的 ...
- Chromium Embedded Framework (CEF)_3.2171.2069_v20170606_x86.tar.xz
CEF 为观看各个直播平台而特此修改的浏览器 可以单独提取 Flash 视频, 并可以修改视频的大小等功能 [增加了960x90% 和 1280x90%] 这次修改是主要针对 YY web 直播平台 ...
- vue.js如何更改默认端口号8080为指定端口
执行npm run dev实际是在调用根目录下的package.json 打开package.json后可发现有这样一段代码 由此可知,我们应该查看build目录下的dev-server.js文件 在 ...
- interface{} 泛型编程
转自: 张晓龙 中兴开发者社区 https://mp.weixin.qq.com/s/EEUtTykcrXhcM2hJT01SoQ 序言 众所周知,Golang中不支持类似C++/Java中的标记式泛 ...
- python学习第38天
mysql的存储引擎(innodb,myisam)mysql支持的数据类型约束表的创建\删除\修改\查看表结构表与表之间的关系
- [C]*和&
一 .& c的&被称为“寻址运算符”,作用是指向某变量的指针: 请看以下代码: int main(void){ int int_1 = 16; printf(" ...
- 基于官方mysql镜像构建自己的mysql镜像
参考文章:https://www.jb51.net/article/115422.htm搭建步骤 1.首先创建Dckerfile: 1 2 3 4 5 6 7 8 9 10 11 12 FROM my ...
- centos6.5 有趣但是没有用的linux命令
小火车 get http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm rpm -ivh epel-rele ...