A Once In My Life
题目要求得到n*k的数里有123456789和额外的d,我们可以直接构造123456789d,但要注意这不一定是n的倍数,所以我们就要考虑,在构造后的数的后面加上某数使其能够被n整除,并且不能改变构造的10位数,
#define int long long
signed main()
{
int t;
cin>>t;
while(t--)
{
int n,d,ans=123456789;
cin>>n>>d;
string s;
s=to_string(n);
ans=(ans+d)*pow(10,s.size());
ans+=n;
ans-=ans%n;
cout<<luck/n<<endl;
}
return 0;
}
M有效算法
对于此题,我们可以将公式转化
−k×b**i+a**i≤x≤k×b**i+a**i
利用二分答案,求出区间
const int maxn=3e5+10;
typedef long long ll;
int T,n;
ll a[manx],b[manx];
bool check(ll k)
{
ll lmx=-1e18,rmi=1e18;
for(int i=1;i<=n;i++)
{
lmx=max(lmx,a[i]-k*b[i]);
rmi=min(rmi,a[i]+k*b[i]);
}
return lmx<=rmi;
}
int main()
{
cin>>T;
while(T--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
ll l=0,r=1e9,mid;
while(l<r)
{
mid(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<l<<endl;
}
return 0;
}