d(A)를 양의 정수 A의 십진수 자릿수라고 하자. 그러면
A@B=A⋅10d(B)+B
이므로, A@B가 B로 나누어떨어질 조건은
B∣A⋅10d(B)
와 같다.
g=gcd(X,Y)라 하고 X=ga, Y=gb라고 쓰자. 그러면 gcd(a,b)=1이고 X<Y이므로 a<b이다. 두 조건은 각각
gb∣ga⋅10d(Y),ga∣gb⋅10d(X)
이고, g를 약분하면
b∣a⋅10d(Y),a∣b⋅10d(X)
이다. gcd(a,b)=1이므로 이는
b∣10d(Y),a∣10d(X)
와 동치이다.
따라서 d(X),d(Y)를 고정하면, a는 10d(X)의 약수, b는 10d(Y)의 약수 중에서 고르면 된다. 또한 gcd(a,b)=1과 a<b를 만족해야 한다.
이제 고정된 dX=d(X), dY=d(Y), a, b에 대해 가능한 g의 범위를 세자. X=ga, Y=gb가 각각 자릿수 dX, dY를 가져야 하므로
10dX−1≤ga≤min(N,10dX−1),
10dY−1≤gb≤min(N,10dY−1)
이어야 한다. 따라서
L=max(⌈a10dX−1⌉,⌈b10dY−1⌉),
R=min(⌊amin(N,10dX−1)⌋,⌊bmin(N,10dY−1)⌋)
이다. L≤g≤R인 정수 g의 개수는 max(0,R−L+1)이다.
N≤1018이므로 가능한 자릿수는 최대 19개이다. 각 d에 대해 10d의 약수는 2i5j 꼴이며 0≤i,j≤d이다. 따라서 모든 dX,dY,a,b를 직접 순회해도 충분히 빠르다.
Solution written by GPT5.5