po姐题解 《论一道题究竟如何出才能同时卡时间卡内存卡精度卡输入卡输出卡评测》
辣鸡题目 颓我精神 耗我时间!!!
把每个值带入假想的式子中 就变成啦 解方程
然后
然后
然后
然后
尼玛 输出这么麻烦 最后一个点跑了 5s 输出跑了 4s
#include <cstdio>
#include <iostream>
using namespace std;
const int N = 21;
int f[1<<N],n,a,b,mu,nn;
char s[N];
int gcd(int x,int y) {return y==0?x:gcd(y,x%y);}
void get()
{
double c;int tmp=0;
scanf("%s %lf",s+1,&c);
for(int i=1;i<=n;i++)
tmp<<=1,tmp|=(s[i]=='+'?1:0);
if(c>0) f[tmp]=(int)(c*100.0+0.5);
else f[tmp]=(int)(c*100-0.5);
}
void p(int x,int y)
{
if(x==0) return ;
if(x<0) printf("-"),x=-x;
int tmp=gcd(x,mu);
if(tmp==mu) printf("%d",x/mu);
else printf("%d/%d",x/tmp,mu/tmp);
if(y!=0) printf(" ");
for(int i=1;i<=n;i++,y<<=1)
if(y&(nn>>1)) printf("x%d",i);
printf("\n");
}
void OUT(int now,int x)
{
int tmp=((x<<1)|1)<<(n-now);
p(f[tmp],tmp);if(now==n) return ;
OUT(now+1,(x<<1)|1);OUT(now+1,(x<<1));
}
int main()
{
scanf("%d",&n);mu=100<<n;
nn= 1<<n;
for(int i=0;i<nn;i++) get();
for(int i=0;i<n;i++)
{
int d=1<<i;
for(int j=0;j<nn;j+=d*2)
for(int 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;
}