hdu 3972 1 M possible

时间:2021-12-15 23:37:40

一般做法:

  显然的超内存

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[],ans[];
int main()
{
int t,i,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=; i<n; i++)
scanf("%d",&a[i]);
sort(a,a+n);
int j=,tmp=;
a[n++]=;
for(i=; i<n; i++)
{
if(a[i]==a[i-])
{
tmp++;
}
else
{
if(tmp!=)
ans[j++]=a[i-];
//printf("%d\n",tmp);
tmp=;
}
} printf("%d %d\n",ans[],ans[]);
}
return ;
}

正确做法:

  位运算

  计算出 a+b以及a*a+b*b

然后求根求出a 和 b

#include<stdio.h>
#include<string.h>
#include<math.h>
#define eps 1e-8
int b[];
__int64 bb[];
int main()
{
int i,n,t;
scanf("%d",&t);
while(t--)
{
int x;
__int64 xx;
memset(b,,sizeof(b));
memset(bb,,sizeof(bb));
scanf("%d",&n);
for(i=;i<n;i++)
{
scanf("%d",&x);
xx=(__int64)x*x; int k=; while(x>)
{
b[k++]+=x%;
x>>=;
} k=;
while(xx>)
{
bb[k++]+=xx%;
xx>>=(__int64);
}
}
x=;
for(i=;i>=;i--)
{
//printf("%d ",b[i]);
x=(x<<)+b[i]%;
}
//printf("\n%d\n",x);
xx=;
for(i=;i>=;i--)
{
//printf("%lld ",bb[i]);
xx=(xx<<(__int64))+bb[i]%;
}
//printf("\n%I64d\n",xx);//(double)
int abs=sqrt((long double)(*xx-(__int64)x*x))+eps;
printf("%d %d\n",(x-abs)/,(x+abs)/);
}
return ;
}

C++提交

#include<stdio.h>
#include<string.h>
#include<math.h>
#define eps 1e-8
int b[];
__int64 bb[];
int main()
{
int i,n,t;
scanf("%d",&t);
while(t--)
{
int x;
__int64 xx;
memset(b,,sizeof(b));
memset(bb,,sizeof(bb));
scanf("%d",&n);
for(i=;i<n;i++)
{
scanf("%d",&x);
xx=(__int64)x*x; int k=; while(x>)
{
b[k++]+=x%;
x>>=;
} k=;
while(xx>)
{
bb[k++]+=xx%;
xx>>=(__int64);
}
}
x=;
for(i=;i>=;i--)
{
//printf("%d ",b[i]);
x=(x<<)+b[i]%;
}
//printf("\n%d\n",x);
xx=;
for(i=;i>=;i--)
{
//printf("%lld ",bb[i]);
xx=(xx<<(__int64))+bb[i]%;
}
//printf("\n%I64d\n",xx);//(double)
int abs=sqrt((*xx-(__int64)x*x))+eps;//不加(__int64),会WA
printf("%d %d\n",(x-abs)/,(x+abs)/);
}
return ;
}