专栏文章

【题解】CF2140B Another Divisibility Problem

CF2140B题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miny70kn
此快照首次捕获于
2025/12/02 10:17
3 个月前
此快照最后确认于
2025/12/02 10:17
3 个月前
查看原文

题意理解

题目先给一个数 xx,算出 yy。接着把 xxyy 拼接起来得到一个新数 kk,要求满足 (x+y)(x + y) 能整除 kk
举个例子:如果 x=12x=12,假设 y=34y=34,那拼接后的 kk 就是 12341234,这时候要检查 12+34=4612+34=46 能不能整除 12341234
很明显不能,所以 y34y \neq 34

思路推导

  • 首先,得解决“拼接”怎么用公式表示。
比如 x=12x=1222 位)、y=345y=34533 位),拼接后是 1234512345,这个结果其实是 12×103+34512 \times 10^3 + 345
所以总结出规律:如果 yydd 位数字,那么拼接后的数 k=10d×x+yk = 10^d \times x + y这一步是整个推导的基础,必须先想明白。
  • 其次,利用整除条件变形
题目核心要求是 (x+y)(x + y) 能整除拼接后的数 kk
根据之前得出的拼接公式 k=10d×x+yk = 10^d \times x + y,这个整除关系用同余表示就是:10d×x+y0(modx+y)10^d \times x + y \equiv 0 \pmod{x + y}
这里可以用一个同余的小技巧简化式子:因为 x+yx + y 本身除以 x+yx + y 的余数是 00,即 x+y0(modx+y)x + y \equiv 0 \pmod{x + y},把 xx 移到等号右边就能得到 yx(modx+y)y \equiv -x \pmod{x + y}
也就是 yyx-x 除以 x+yx + y 的余数相同。
yx(modx+y)y \equiv -x \pmod{x + y}
代入之前的同余式 10d×x+y0(modx+y)10^d \times x + y \equiv 0 \pmod{x + y}
yy 替换成 x-x,就能得到 10d×x+(x)0(modx+y)10^d \times x + (-x) \equiv 0 \pmod{x + y}
再把左边的 xx 提取出来整理,最终简化为 (10d1)×x0(modx+y)(10^d - 1) \times x \equiv 0 \pmod{x + y}
  • 接着,找最简单的满足条件的情况。
要让 (10d1)×x(10^d - 1) \times x 能被 x+yx + y 整除,最直接的办法就是让 x+yx + y 等于 10d110^d - 1
因为 10d110^d - 1(10d1)×x(10^d - 1) \times x 的约数,肯定能整除。
这样一来,y=(10d1)xy = (10^d - 1) - x,接下来只要确定 dd 的值就行。
  • 最后,确定 dd 的取值。
题目要求 y<109y < 10^9,同时 x<108x < 10^8。我们先假设 d=9d=9
因为 y=(10d1)xy = (10^d - 1) - x10d1=1091=99999999910^d - 1 = 10^9 - 1 = 999999999
等量代换 y=999999999xy=999999999 - x
因为 x<108x < 10^8,所以 yy 最小是 9.99999999×1099.9999999×108=9×1089.99999999 \times 10^9- 9.9999999\times 10^8 = 9 \times 10^8,显然满足 y<109y < 10^9,而且 yy 的位数正好是 99 位,完全符合条件。
所以结论就是:y=999999999xy = 999999999 - x

代码实现

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

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        long long x;
        cin>>x;
        cout<<999999999 - x<<endl;
    } 
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...