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. 研究背景 目前存在的计算机视觉任务 ...
随机推荐
- VC显示网页验证码、模拟CSDN网页登录
摘要:by:koma 这两天,本来想花点时间研究一下QQ空间.农场外挂,于是抓包分析一了下,只可惜,在QQ网页登录时进行了加密处理,可惜我对网页编程一窍不通.有些朋友曾讲过那些是通过JS代码进行加密, ...
- vc++基础班[27]---实现一个简单的任务管理器
因为任务管理器中涉及到进程的枚举操作,所以把两节课的知识点合并到一起来讲! ①.设计界面.以及列表控件变量的绑定: ②.列表控件样式的指定: m_TaskList.SetExtendedSty ...
- python二叉树练习
#coding=utf8 node_list=[5,3,6,2,4,None,8,1,None,None,None,7,9] class Node: def __init__(self,item): ...
- centos6.8配置php-fpm(php已在apache中以模块形式运行,nginx中同时以fastcgi运行)
location ~ \.php(.*)$ { root /mnt/www/wenyin; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; ...
- 【转】STL中vector、list、deque和map的区别
1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...
- jquery获取当前按钮、截取字符串、字符串拼接、动态循环添加元素
截取字符串:字符串拼接:动态循环添加元素:获取当前按钮: {data : null, render: function(data, type, row ) { var loginName = $(&q ...
- 蓝皮书:异象石 【dfs序+lca】
题目详见蓝皮书[算法竞赛:进阶指南]. 题目大意: 就是给你一颗树,然后我们要在上面进行三种操作: 1.标记某个点 或者 2.撤销某个点的标记 以及 3.询问标记点在树上连通所需的最短总边 ...
- Callcenter 模块解析
CallCenter模块详细介绍 一. Callcenter模块说明: 提供了呼叫中心的ACD功能,把客户端通过不同的”方案”和”等级”分配给来电,一个以”评分”为基础的系统是用来分配这些呼入.来电者 ...
- cocos2d内存管理,类的生命周期
下面资料来自<Cocos2d-x之Lua核心编程>
- AES对数据进行加密与解密
AES对数据进行加密与解密随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即A ...