[TK] CF1526B I Hate 1111

给定一个数,将它表示成若干个形如 \(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;
	}
}
posted @ 2024-08-06 21:30  HaneDaniko  阅读(31)  评论(0编辑  收藏  举报