洛谷 P4106 / bzoj 3614 [ HEOI 2014 ] 逻辑翻译 —— 思路+递归
题目:https://www.luogu.org/problemnew/show/P4106
https://www.lydsy.com/JudgeOnline/problem.php?id=3614
从很小的情况考虑,看题面上的样例:
x1=+1 x2=+1 0
x1=+1 x2=-1 1
x1=-1 x2=+1 2
x1=-1 x2=-1 3
手算的做法应该是设原式为 a0 + a1x1 + a2x2 + a3x1x2
通过加减,把关于 x2,x1 的项逐渐消去,得到常数项后再回代,逐个得出答案;
然后我们发现加减的两个式子的位置也是有规律的,如果把-1看作0,+1看作1,式子的系数从小到大排序:
x1=-1 x2=-1 3 —— 1
x1=-1 x2=+1 2 —— 2
x1=+1 x2=-1 1 —— 3
x1=+1 x2=+1 0 —— 4
12相加得到 x1 = -1 时无 x2 的值(+a0),34相加得到 x1 = 1 时无 x2 的值(+a0);
21相减得到 x2 = 1 时无 x1 的值(-a3),43相减得到 x2 = 1 时无 x1 的值(+a3);
两个相加的结果再相加得出a0,相减得出a1,两个相减的结果同理;
可以发现,这样做其实就是把问题的规模变成了一半,可以递归求解;
但空间很小,为了不递归,可以仿照FFT,FWT等,通过位置安排来直接循环做;
实际上,最初的相邻两位置加减,让 xn 的有无与该位置末位的 0/1 对应;
以此类推,如果倍增加减,则每个 xi 的有无就和该位置的第 i 位的 0/1 对应;
“xi 的有无”意思是这个值中关于 xi 的项还是否存在;
所以最后答案的 xi 情况就和其位置上的 0/1 分布情况一样,像FWT一样跳着加减就能得到;
过程中不要除以2,最后输出时把 2^n 放在分母上;
递归输出即可按照字典序,详见代码囧
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef double db;
int const xn=(<<);
int n,lim,f[xn];
char dc[];
int gcd(int a,int b){return b?gcd(b,a%b):a;}
void get()
{
scanf("%s",dc); int t=; db ff;
for(int j=;j<n;j++){t<<=; if(dc[j]=='+')t|=;}
scanf("%lf",&ff);
if(ff>)f[t]=(int)(ff*+0.5);
else f[t]=(int)(ff*-0.5);//!
}
void print(int x,int s)
{
if(x==)return; if(x<)putchar('-'),x=-x;//
int t=(<<n),g=gcd(x,t);//t:100*(/2)^n
if(g==t)printf("%d",x/g); else printf("%d/%d",x/g,t/g);
if(!s){puts(""); return;} putchar(' ');
for(int i=n-,nw=;i>=;i--,nw++)if(s&(<<i))printf("x%d",nw);
puts("");
}
void work(int nw,int s)
{
int t=((s<<|)<<(n-nw));
print(f[t],t); if(nw==n)return;
work(nw+,(s<<)|);
work(nw+,(s<<));
}
int main()
{
scanf("%d",&n); lim=(<<n);
for(int i=;i<=lim;i++)get();
for(int i=;i<n;i++)
{
int t=(<<i),d=(t<<);
for(int j=;j<lim;j+=d)
for(int k=;k<t;k++)
{
int x=f[j+k],y=f[j+t+k];
f[j+k]=x+y; f[j+t+k]=y-x;
}
}
print(f[],); work(,);
return ;
}
洛谷 P4106 / bzoj 3614 [ HEOI 2014 ] 逻辑翻译 —— 思路+递归的更多相关文章
- 洛谷 4106 / bzoj 3614 [HEOI2014]逻辑翻译——思路+类似FWT
题目:https://www.luogu.org/problemnew/show/P4106 https://www.lydsy.com/JudgeOnline/problem.php?id=3614 ...
- 洛谷 P3307: bzoj 3202: [SDOI2013] 项链
题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...
- 洛谷 P3332 BZOJ 3110 [ZJOI2013]K大数查询
题目链接 洛谷 bzoj 题解 整体二分 Code #include<bits/stdc++.h> #define LL long long #define RG register usi ...
- 洛谷 P2486 BZOJ 2243 [SDOI2011]染色
题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221” ...
- 洛谷 P2827 BZOJ 4721 UOJ #264 蚯蚓
题目描述 本题中,我们将用符号表示对c向下取整,例如:. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现在共有n只蚯蚓(n为正整数).每只 ...
- 洛谷 P2155 BZOJ 2186 codevs 2301 [SDOI2008]沙拉公主的困惑
题目描述 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的 ...
- 洛谷 P2046 BZOJ 2007 海拔(NOI2010)
题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个 ...
- 洛谷 P1903 BZOJ 2120 清橙 A1274【模板】分块/带修改莫队(数颜色)(周奕超)
试题来源 2011中国国家集训队命题答辩 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...
- 洛谷 P2709 BZOJ 3781 小B的询问
题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求$\sum_1^Kc_i^2$的值,其中$c_i$表示数字i在[L..R]中的重复次数.小B请 ...
随机推荐
- GIT客户端的使用【原创】
这次分享的方式,采用的是视频的形式,视频是本人录制. 在做项目使用SVN的时候经常有各种错误出现,所以萌发使用git的想法.在学习git的过程中发现一个神器就是分支,虽然在SVN里也有分支,但由于机制 ...
- MyBatis做动态模糊查询时,like后面要不要加单引号??
做项目遇到了个奇怪的问题,项目里面要对商品.账户.进行分别的多条件查询,于是我就采用动态多条件分页查询,起初在做账户部分的时候Mybatis是这样写的 <!-- 动态多条件分页查询 --> ...
- 22 nginx配置与集群
一:编译nginx ,并配置 Cd /app/pcre-8.12 ./configure Make && make install Cd nginx-1.2.7 ./configure ...
- 转载 -- iOS开发之JSON格式数据的生成与解析
本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? ...
- Cocos2d-x 3.0final 终结者系列教程16-《微信飞机大战》实现
看到cocos2d-x推出了3.1版本号,真是每月一次新版本号,速度. 另一个好消息就是http://cn.cocos2d-x.org/上线了,祝贺!啥时候把我的视频和教程放上去呢?!! . 视频下载 ...
- 用nvm管理windows nodejs时用npm全局安装的插件无法调用的解决方案
在环境变量中啊新建变量NODE_PATH赋值为prefix设置的地址即 prefix=D:\Users\xxx\AppData\Roaming\nodejs\npm-global 然后把%NODE_P ...
- Eclipse + JDK + tomcat开发环境配置
第一步:下载jdk和tomcat:JDK下载 Tomcat下载 最新的jdk为1.6.10,tomcat为6.0,建议jdk1.4以上,tomcat4.0以上 第二步:安装和配置 ...
- Flask:基本结构
python有两个比较出名的网络框架,一个是django,一个是flask. 之前的django文章里面介绍了django的各种用法,这个系列开始介绍flask的用法.相比与django,flask更 ...
- 如何查看apache配置文件路径
我是用https://lamp.sh/安装的,apache配置文件位置在:/usr/local/apache/conf/httpd.conf如果是直接安装的apache,配置文件应该在:/etc/ht ...
- matlab vs使用
~ matlab无论什么程序只输出 ans 1 注意matlab命名规则:1不能与matlab内部函数名字重合.2.文件名首字母不能是数字或下划线.3.文件名中不能有空格.4.文件名不能太长.5注意大 ...