题目
思路
写了完全背包,铁超时。
观察发现,由
{
11
,
111
}
\{11,111\}
{11,111}两个基就能表示给出的k(k>2)位为1的数字。所以这两个数构成基就够了。
那么,符合题意的x,一定满足
x
=
111
∗
k
+
11
∗
c
x=111 * k + 11 * c
x=111∗k+11∗c的形式。枚举这样的k即可。
k
=
x
/
10
≤
1
0
7
k = x / 10 \le 10^7
k=x/10≤107,取模判断(x - 111 * k) % 11复杂度为常数,故可行。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main() {
int n_test;
cin >> n_test;
while (n_test--) {
LL x;
cin >> x;
vector<int> weights = {11, 111};
int nk = x / 111;
bool flag = false;
for (int i = 0; i <= nk; ++i) {
if ((x - (i * 111)) % 11 == 0) {
flag = true;
break;
}
}
if (flag) {
printf("YES\n");
} else
printf("NO\n");
}
}