[TK] CF1526B I Hate 1111

HaneDaniko發表於2024-08-06

給定一個數,將它表示成若干個形如 \(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;
	}
}

相關文章