CF1526B I Hate 1111

传送门


题意

询问一个数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;
}
posted @ 2021-11-13 11:17  ltdJcoder  阅读(48)  评论(0编辑  收藏  举报