题目链接。
题意:给定 N N N 和 M M M,找到 x , y ∈ 1 , N x,y\in1,N x,y∈1,N 满足 concat ( x , y ) ≡ x + y ( m o d M ) \operatorname{concat} (x,y)\equiv x+y \pmod{M} concat(x,y)≡x+y(modM) 的对数。
首先 concat ( x , y ) = x × 10 sum ( y ) + y \operatorname{concat}(x,y)=x\times10^{\operatorname{sum}(y)}+y concat(x,y)=x×10sum(y)+y, sum ( y ) \operatorname{sum}(y) sum(y) 表示 y y y 十进制下的位数。所以可以推式子。
x × 10 sum ( y ) + y ≡ x + y ( m o d M ) ⟹ ( 10 sum ( y ) − 1 ) x ≡ 0 ( m o d M ) x\times10^{\operatorname{sum}(y)}+y\equiv x+y \pmod{M}\Longrightarrow (10^{\operatorname{sum}(y)}-1)x\equiv 0 \pmod{M} x×10sum(y)+y≡x+y(modM)⟹(10sum(y)−1)x≡0(modM)
我们枚举 a = 10 sum ( y ) − 1 a=10^{\operatorname{sum}(y)}-1 a=10sum(y)−1,计算的就是同余方程 a x ≡ 0 ( m o d M ) ax\equiv 0 \pmod{M} ax≡0(modM) 中 x x x 的解的个数,再乘上满足 sum ( y ) \operatorname{sum}(y) sum(y) 等于我们枚举的定值的 y y y 的个数,加到答案里。
因为 a x ≡ 0 ( m o d M ) ⟹ a x + M y ′ = 0 ax\equiv 0 \pmod{M}\Longrightarrow ax+My'=0 ax≡0(modM)⟹ax+My′=0,记 d = gcd ( a , M ) d=\gcd(a,M) d=gcd(a,M),这个二元一次方程很特殊, x x x 的通解为 x = k M d ( k ∈ Z ) x=k\dfrac{M}{d}(k\in \mathbb{Z} ) x=kdM(k∈Z),所以解要满足下面的条件。
1 ≤ k M d ≤ N ⟹ 1 × d M ≤ k ≤ N × d M ⟹ 1 ≤ k ≤ N × d M 1\le k\dfrac{M}{d}\le N\Longrightarrow 1\times\dfrac{d}{M}\le k\le N\times\dfrac{d}{M} \Longrightarrow 1\le k\le N\times\dfrac{d}{M} 1≤kdM≤N⟹1×Md≤k≤N×Md⟹1≤k≤N×Md
而 y y y 的个数就是满足位数为 sum ( y ) \operatorname{sum}(y) sum(y) 的数的个数(即一位数的个数,两位数的个数......)可以很简单地求出。
核心代码:
cpp
void solve(){
__int128 n,m;
read(n);read(m);
int t=sum(n);
__int128 k=1;
__int128 ans=0;
for(int i=1;i<=t;i++){
k*=(__int128)10;
__int128 d=gcd(k-1,m);
__int128 l=1;
__int128 r=d*n/m;
ans+=(r-l+1)*(min(n,k-1)-k/10+1)%998244353;
ans%=998244353;
}
prin(ans);
putchar('\n');
}