题目:Codeforces Round 723 (Div. 2) B. I Hate 1111
题意 :
在codeforce中可知
x的范围是:
1
1
1 ~
1
0
9
10^9
109
所以就是问:
要我们使用任意个(当然不能是负数个)
11
,
111
,
1111
,
11111
,
111111
,
1111111
,
11111111
11,111,1111,11111,111111,1111111,11111111
11,111,1111,11111,111111,1111111,11111111进行求和得到
x
x
x
能的话YES, 不能的话NO
例:
- 33 = 11 + 11 + 11 33=11+11+11 33=11+11+11
- 144 = 111 + 11 + 11 + 11 144=111+11+11+11 144=111+11+11+11
- 而 69 69 69 不能被表示
输入:
3
33
144
69
输出:
YES
YES
NO
思路:
对于
111111111
,
1111111
,
111111
,
11111
,
1111
,
111
,
11
111111111, 1111111, 111111, 11111, 1111, 111, 11
111111111,1111111,111111,11111,1111,111,11可以发现
1111
1111
1111以后的关于1的一串数都可以被
11
11
11 和
111
111
111 表示
也就是被1111以后的关于1的一串数整除的数,可以表示为
x
=
11
a
+
111
b
x = 11a + 111b
x=11a+111b
所以这题意思就是看一个数能否被表示成
11
a
+
111
b
11a + 111b
11a+111b
也即是
n
=
11
a
+
111
b
n = 11a + 111b
n=11a+111b成立 (其中
a
>
=
0
,
b
>
=
0
a >= 0, b >= 0
a>=0,b>=0是整数)
然后很巧妙的令
b
=
11
c
+
d
(
0
≤
d
<
11
)
b = 11c + d (0≤d < 11)
b=11c+d(0≤d<11)
化简把条件的式子变成了
n
=
11
a
+
111
(
11
c
+
d
)
n = 11a + 111(11c + d)
n=11a+111(11c+d)
进一步:
n
−
111
d
=
11
(
a
+
111
c
)
n - 111d = 11(a + 111c)
n−111d=11(a+111c)
因为
a
+
111
c
a + 111c
a+111c是整数
所以要求就是
(
n
−
111
d
)
%
11
=
=
0
(n - 111d) \% 11 == 0
(n−111d)%11==0, 也就是
n
−
111
d
n - 111d
n−111d能不能被11整除
然后可以枚举
d
d
d进行判断,根据d的定义可知范围就是
0
0
0 ~
10
10
10
所以最多枚举11次,复杂度低
#include <iostream>
#include <algorithm>
#include <queue>
#define int long long
using namespace std;
const int N = 100010;
int w[] = {111111111, 1111111, 111111, 11111, 1111, 111, 11};
void solve()
{
int n ; cin >> n;
// 对于111111111, 1111111, 111111, 11111, 1111, 111, 11可以发现
// 1111以后的关于1的一串数都可以被11 和 111 表示
// 也就是被1111以后的关于1的一串数整除的数,可以表示为x = 11a + 111b
// 所以这题意思就是看一个数能否被表示成11a + 111b
// 也即是n = 11a + 111b成立 (其中a >= 0, b >= 0 是整数)
// 然后很巧妙的令b = 11c + d (d < 11)
// 化简把条件的式子变成了
// n = 11a + 111(11c + d)
// n - 111d = 11(a + 111c)
// 因为a + 111c是整数
// 所以要求就是n - 111d % 11 == 0, 也就是n - 111d能不能被11整除
// 然后可以枚举d进行判断,根据证明d的范围就是0 ~ 10, 所以最多枚举11次
for(int d = 0 ; n - 111 * d >= 0 ; d ++)
{
if((n - 111 * d) % 11 == 0)
{
puts("YES");
return ;
}
}
puts("NO");
}
signed main()
{
int _; cin >> _;
while(_--) solve();
return 0;
}