結果
| 問題 | No.3398 Accuracy of Integer Division Approximate Function 2 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-12-12 15:50:23 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,031 bytes |
| 記録 | |
| コンパイル時間 | 3,636 ms |
| コンパイル使用メモリ | 292,388 KB |
| 実行使用メモリ | 7,852 KB |
| 最終ジャッジ日時 | 2025-12-12 15:50:28 |
| 合計ジャッジ時間 | 4,785 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 3 |
| other | WA * 20 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:31:16: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
31 | int t;scanf("%d",&t);
| ~~~~~^~~~~~~~~
main.cpp:33:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
33 | scanf("%lld%lld%lld%lld",&D,&A,&B,&K);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn=200005;
const ll inf=1e18;
const ll BASE=1000000000000000000;
struct BigInt{
vector<ll> v;
BigInt(ll n=0){if(n<0)return;v.push_back(n);norm();}
void norm(){while(v.size()>1 and v.back()==0)v.pop_back();}
bool operator<(const BigInt&o)const{if(v.size()!=o.v.size())return v.size()<o.v.size();for(int i=v.size()-1;i>=0;i--)if(v[i]!=o.v[i])return v[i]<o.v[i];return 0;}
bool operator>(const BigInt&o)const{return o<*this;}
bool operator<=(const BigInt&o)const{return not(o<*this);}
bool operator>=(const BigInt&o)const{return not(*this<o);}
bool operator==(const BigInt&o)const{return not(*this<o) and not(o<*this);}
BigInt operator+(const BigInt&o)const{BigInt r;r.v.resize(max(v.size(),o.v.size()),0);ll c=0;for(int i=0;i<r.v.size() or c;i++){if(i==r.v.size())r.v.push_back(0);ll a=(i<v.size()?v[i]:0),b=(i<o.v.size()?o.v[i]:0);__int128 s=(__int128)a+b+c;r.v[i]=s%BASE;c=s/BASE;}return r;}
BigInt operator-(const BigInt&o)const{BigInt r;r.v.resize(v.size());ll c=0;for(int i=0;i<v.size();i++){ll a=v[i],b=(i<o.v.size()?o.v[i]:0);__int128 s=(__int128)a-b-c;if(s<0){s+=BASE;c=1;}else c=0;r.v[i]=s;}r.norm();return r;}
BigInt operator*(const BigInt&o)const{if(v.empty() or o.v.empty())return BigInt(0);BigInt r;r.v.resize(v.size()+o.v.size(),0);for(int i=0;i<v.size();i++){__int128 c=0;for(int j=0;j<o.v.size() or c;j++){__int128 s=r.v[i+j]+(__int128)v[i]*(j<o.v.size()?o.v[j]:0)+c;r.v[i+j]=s%BASE;c=s/BASE;}}r.norm();return r;}
BigInt operator/(__int128 n)const{if(n==0)return BigInt(0);BigInt r;r.v.resize(v.size());__int128 c=0;for(int i=v.size()-1;i>=0;i--){__int128 val=c*BASE+v[i];r.v[i]=val/n;c=val%n;}r.norm();return r;}
void print(){if(v.empty()){printf("0\n");return;}printf("%lld",v.back());for(int i=v.size()-2;i>=0;i--)printf("%018lld",v[i]);printf("\n");}
};
ll D,A,B,K;
bool check(const BigInt& y){
BigInt n1=y*BigInt(B)+BigInt(B-1),q1=n1/D;
BigInt n2=y*BigInt(A),q2=n2/B;
if(q1<q2)return 0;
BigInt diff=q1-q2;
return diff>=BigInt(K+1);
}
int main(){
int t;scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld%lld",&D,&A,&B,&K);
__int128 d=D,a=A,b=B;
if(b*b<=a*d){
__int128 req=(__int128)D*(K+1);
if(req<B){BigInt ans((ll)req);ans.print();}
else printf("-1\n");
}else{
BigInt l(0),r; r.v={0,0,500};
BigInt ans; ans.v.clear();
while(l<=r){
BigInt mid=(l+r)/2;
if(check(mid)){
ans=mid;
if(mid.v.size()==1 and mid.v[0]==0) break;
r=mid-BigInt(1);
}else l=mid+BigInt(1);
}
if(ans.v.empty()) printf("-1\n");
else{
BigInt t1=ans*BigInt(B);
BigInt t2=(ans*BigInt(A)/B+BigInt(K+1))*BigInt(D);
if(t1<t2) t2.print(); else t1.print();
}
}
}
return 0;
}