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