[HEOI2014]逻辑翻译

传送门

这道题其实很简单啊

三个变量时,把含有 x 1 x1 x1的项提出来:

f ( x ) = x 1 ( a 0 x 2 x 3 + a 1 x 2 + a 2 x 3 + a 4 ) + ( a 3 x 2 x 3 + a 5 x 2 + a 6 x 3 + a 7 ) f(x)=x1(a0x2x3+a1x2+a2x3+a4)+(a3x2x3+a5x2+a6x3+a7) f(x)=x1(a0x2x3+a1x2+a2x3+a4)+(a3x2x3+a5x2+a6x3+a7)

x 1 = 1 x1=1 x1=1 x 1 = − 1 x1=-1 x1=1代入,得到的两个柿子分别相加相减再除以 2 2 2,就得到了两个只有原来一半规模的柿子,然后递归做就好了

输出很麻烦

#include<bits/stdc++.h>
#define il inline
#define rint register int
using namespace std;
int f[1<<21],n,a,b,mu,nn;char s[21];
il int gcd(rint x,rint y) {return y==0?x:gcd(y,x%y);}
il void get(){
	double c;rint t=0;
	scanf("%s %lf",s+1,&c);
	for(int i=1;i<=n;++i) t<<=1,t|=(s[i]=='+'?1:0);
	if(c>0) f[t]=(int)(c*100.0+0.5);
	else f[t]=(int)(c*100-0.5); 
}
il void p(rint x,rint y){
	if(x==0) return ;if(x<0) printf("-"),x=-x;
	rint t=gcd(x,mu);t==mu?printf("%d",x/mu):printf("%d/%d",x/t,mu/t);
	if(y!=0) printf(" ");for(int i=1;i<=n;++i,y<<=1) if(y&(nn>>1)) printf("x%d",i);
	putchar('\n');
}
il void OUT(rint s,rint x){
	int t=((x<<1)|1)<<(n-s);
	p(f[t],t);if(s==n) return;
	OUT(s+1,(x<<1)|1);OUT(s+1,(x<<1));
}
int main(){
	scanf("%d",&n);mu=100<<n;nn=1<<n;
	for(rint i=0;i<nn;++i) get();
	for(rint i=0;i<n;++i){
		rint d=1<<i;
		for(rint j=0;j<nn;j+=d*2) for(rint k=j;k<j+d;++k)
		a=f[k],b=f[k+d],f[k]=a+b,f[k+d]=b-a;
	}
	p(f[0],0);OUT(1,0);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值