結果
| 問題 |
No.550 夏休みの思い出(1)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-03-12 00:07:36 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 2,134 bytes |
| コンパイル時間 | 892 ms |
| コンパイル使用メモリ | 73,400 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-16 04:12:12 |
| 合計ジャッジ時間 | 2,896 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 55 |
コンパイルメッセージ
main.cpp:120:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
120 | main()
| ^~~~
ソースコード
#include<iostream>
#include<algorithm>
using namespace std;
const long BASE=1e9;
const int WD=4;
struct ll
{
long dat[WD+1];
ll(long X=0)
{
bool neg=false;
if(X<0)
{
neg=true;
X=-X;
}
for(int i=0;i<WD;i++)
{
dat[i]=X%BASE;
X/=BASE;
}
dat[WD]=0;
if(neg)negate();
}
bool iszero()
{
for(int i=0;i<=WD;i++)if(dat[i]!=0)return false;
return true;
}
bool isneg()
{
return dat[WD]==1;
}
void negate()
{
if(!iszero())
{
for(int i=0;i<WD;i++)
{
dat[i]=BASE-dat[i]-(i>0);
}
dat[WD]=1-dat[WD];
}
}
void add(const ll&B)
{
for(int i=0;i<=WD;i++)
{
dat[i]+=B.dat[i];
if(dat[i]>=BASE)
{
dat[i]-=BASE;
dat[i+1]++;
}
}
dat[WD]%=2;
}
void mul(ll B)
{
bool negflag=false;
if(isneg())
{
negflag=!negflag;
negate();
}
if(B.isneg())
{
negflag=!negflag;
B.negate();
}
for(int i=WD-1;i>=0;i--)
{
for(int j=WD-1-i;j>0;j--)
{
dat[i+j]+=dat[i]*B.dat[j];
}
dat[i]*=B.dat[0];
}
for(int i=0;i<WD-1;i++)
{
dat[i+1]+=dat[i]/BASE;
dat[i]%=BASE;
}
dat[WD-1]%=BASE;
if(negflag)negate();
}
};
ll A,B,C;
ll f(long x)
{
ll X(x);
ll ret(0L);
ret.add(C);
ll BX=X;
BX.mul(B);
ret.add(BX);
ll AX=X;
AX.mul(X);
ll XXX=AX;
AX.mul(A);
ret.add(AX);
XXX.mul(X);
ret.add(XXX);
return ret;
}
ll D,E;
ll g(long x)
{
ll X(x);
ll ret(0L);
ret.add(E);
ll DX=X;
DX.mul(D);
ret.add(DX);
ll XX=X;
XX.mul(X);
ret.add(XX);
return ret;
}
main()
{
long a,b,c;cin>>a>>b>>c;
A=ll(a);
B=ll(b);
C=ll(c);
long Lx=-1e9,Rx=1e9;
while(Rx-Lx>1)
{
long Mx=(Lx+Rx)/2;
if(f(Mx).isneg())Lx=Mx;
else Rx=Mx;
}
long alpha=Rx;
D=ll(a+alpha);
E=ll(alpha*alpha);
E.add(B);
A.mul(ll(alpha));
E.add(A);
a+=alpha;
a=-a;
long BL=-1e9,BR,CL,CR=1e9;
if(a%2==0)
{
BR=a/2;
CL=a/2;
}
else
{
BR=a>=0?a/2+1:a/2;
CL=a>=0?a/2:a/2-1;
}
while(BR-BL>1)
{
long BM=(BR+BL)/2;
if(g(BM).isneg())BR=BM;
else BL=BM;
}
while(CR-CL>1)
{
long CM=(CR+CL)/2;
if(g(CM).isneg())CL=CM;
else CR=CM;
}
long ans[3]={alpha,BL,CR};
sort(ans,ans+3);
cout<<ans[0]<<" "<<ans[1]<<" "<<ans[2]<<endl;
}