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. 研究背景 目前存在的计算机视觉任务 ...
随机推荐
- Django-jinjia2的赋值
一 变量 1. 变量的形式是:{{ variable }},当模板引擎碰到变量时,引擎使用变量的值替代变量: 2. 使用“.”能够访问变量的属性: 3. 当模板引擎碰到“.”的时候,查找顺序是: a) ...
- codeforces 412div.2
A CodeForces 807A Is it rated? B CodeForces 807B T-Shirt Hunt C CodeForces 807C Success ...
- pointer & iterator
pointer: address, use operator(*) to get/set the value 1) support operator(+,-), move to next posito ...
- 【原创】大数据基础之Hive(5)性能调优Performance Tuning
1 compress & mr hive默认的execution engine是mr hive> set hive.execution.engine;hive.execution.eng ...
- select+异步
IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: 当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用. 当一个客户 ...
- Modbus库开发笔记:Modbus ASCII Slave开发
与Modbus RTU在串行链路上分为Slave和Master一样,Modbus ASCII也分为Slave和Master,这一节我们就来开发Slave.对于Modbus ASCII从站来说,需要实现 ...
- laravel 更新验证
public function update(Request $request, User $user) { // 验证规则. $rules = [ 'email' => [ 'nullable ...
- react 使用draft.js富文本编辑器
参照网址:https://www.cnblogs.com/3body/p/6224010.html 参看网址:https://www.cnblogs.com/mosquito18/p/9787816. ...
- java----DOS命令
dir /? 查看帮助 dir /s 查看当前的目录,以及子目录
- 课外知识----base64加密
每3个字符产生4位的base64字符,不足3个字符,将用“=”补齐至4位base64字符 例如 00---> MDA= 000--->MDAw base64加密特点 加密后的字符数是4的 ...