传送门
题意
询问一个数x, 是否可以由 \(11,111,1111,11111,… ?\)中的某些相加得到(每个数可以用多次)
题解
其实不难。
自然而然的想到, 假如有偶数个11比如1111, 111111, 肯定都是11的倍数,感觉不如直接用11
对于奇数个11, 必然是11的倍数加上111,
所以: 只有11和111有用
中间的思考过程很复杂, 就不写了主要是当时神志不清
容易发现, 如果这个数是合法的, 那么他除了111就是11(废话
考虑枚举有多少111, 然后剩下的是否可以被11整除
如何优化? 显然: 当我们用了很多111的时候, 每11个111都是11的倍数, 干脆用11算了
所以其实111的个数不超过11, 枚举即可
感觉很妙
Impl
#include <iostream>
#include <cstdio>
using namespace std;
int read(){
int num=0, flag=1; char c=getchar();
while(!isdigit(c) && c!='-') c=getchar();
if(c == '-') c=getchar(), flag=-1;
while(isdigit(c)) num=num*10+c-'0', c=getchar();
return num*flag;
}
const int N = 290005;
int T, n;
int A[N];
int solve(int x){
if(x%11 == 0) return true;
for(int i=1; i<=20; i++){
if(x >= 111*i && (x-111*i)%11==0) return true;
}
return false;
}
int main(){
T = read();
while(T--){
int x = read();
printf(solve(x)?"YES\n":"NO\n");
}
return 0;
}