Skip to main content

P9390 金盏花

· 2 min read

题意简述

有一个 1212 位整数 XX,已知它的后 66 位构成的整数是 YY。再给定一个不超过 1212 位整数 ZZ,求所有可能的 XXXZ|X-Z| 的最小值。

解题思路

ZZ 不是 1212 位整数(Z<1012Z<10^{12}),则必定有 X>ZX>Z。要让 XX 尽可能小,令 X=100000YX=\overline{100000Y}XZ=YZ+1012|X-Z|=Y-Z+10^{12}

否则 XXZZ 位数相同,考虑三种情况的最小值即可:

  1. 66 位相同:XZ=YZmod106|X-Z|=|Y-Z\bmod 10^6|
  2. 55 位相同,第 66 位大 11XZ=YZmod106+106|X-Z|=|Y-Z\bmod 10^6+10^6|
  3. 55 位相同,第 66 位小 11XZ=YZmod106106|X-Z|=|Y-Z\bmod 10^6-10^6|

时间复杂度为 O(1)O(1)

参考代码

#include <bits/stdc++.h>
using namespace std;

using ll=long long;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll y,z;
cin>>y>>z;
if(z<100000000000)cout<<y-z+100000000000<<'\n';
else cout<<min({abs(y-z%1000000),abs(y-z%1000000+1000000),abs(y-z%1000000-1000000)})<<'\n';
return 0;
}