给定一个数,将它表示成若干个形如 \(11,111,1111\cdots\) 之类的数之和,判断有没有可行解
考虑到一种贪心,即从高位开始依次向下减去每位数字,判断还能不能减动,减不动或者没减完就报告无解. 显然这样的贪心仅在 \(11,111,1111\cdots\) 的出现次数之和不超过 \(9\) 时是稳定正确的,一旦涉及到进位问题,贪心做法便不可取.
因此我们分类讨论来做这道题:
对于这个数 \(x\) 中, \(1\) 的个数为偶数的部分(即 \(11,1111,111111\cdots\)),可以发现它们全部都是 \(11\) 的倍数
对于 \(x\) 中,\(1\) 的个数为奇数的部分(除 \(1\)),可以发现它们都可以通过减去一个 \(111\) 来变成 \(11\) 的倍数. 综上,原数可以表示为 \(11\) 的倍数与 \(111\) 的倍数之和,因此我们设其为 \(x=11a+111b\)
考虑直接对原数模 \(11\),这样操作剩下的余数可以求得,考虑到 \(111\mod 11=1\),因此 \((11a+111b)\mod 11=b\),即余数就为原数中 \(111\) 的个数.
因为除此之外,对 \(11\) 的个数并无要求,因此只需要判断 \(111r\) 与 \(x\) 的大小关系来判断合法性即可.
#include<bits/stdc++.h>
using namespace std;
int main(){
int cases;cin>>cases;while(cases--){
int n;cin>>n;
cout<<((n%11)*111<=n?"yes":"no")<<endl;
}
}
标签:11,int,CF1526B,1111,cdots,111,cases,Hate
From: https://www.cnblogs.com/HaneDaCafe/p/18346029