1. 程式人生 > 其它 >upc2021個人訓練賽第22場A. 聯通數(思維)

upc2021個人訓練賽第22場A. 聯通數(思維)

問題 A: 聯通數

時間限制: 1 Sec 記憶體限制: 128 MB

題目描述

數學高手小G最近發現了一種新型的數!
他首先在草稿紙寫下任意長度的數字串kkkkkkkkkkk...(1≤k≤9)並在其中間新增加號,且相鄰兩個加號之間至少含有兩個數字k (預設數字串第一個數字前與最後一個數字後也有兩個加號),然後對其進行求和得出一個新的數。像這樣得出的數他將其定義為 “k聯通數 ” 。
小G對於他的發現感到非常的自豪, 像數字854就能表示為77+777,因此854是7聯通數。
小G現在非常好奇, 究竟有哪些數可以是k聯通數呢?他想考驗一下你。
詢問T次,每次給定兩個數n,k,判斷 n是否為k聯通數, 如果是,輸出 YES,否則出 NO。
輸入
第一行一個整數T,表示詢問個數。
接下來T行,每行兩個整數n,k,意義如上所示。
輸出
T行,每行輸出 YES 或 NO。
樣例輸入 Copy
3
854 7
111 2
554 2
樣例輸出 Copy
YES
NO
YES

思路:

跟cf的某題有點類似。
假設\(k=8\),考慮將數拆成\(88\)\(8\)的組合,如果\(88\)的個數除以\(10\)大於\(8\)的個數,就是可以構成的。
比如,當\(n=10752\)時:
\(10752/88=122\),
\(10752\%88=16\)
\(122\)的個位數\(2\)拿出來看作是\(2*88\)
剩下\(120*88\),即\(12*880\)
由於\(16=2*8\),拿出兩個\(880\)\(8\)組合為\(888\)
剩下\(10*880\)\(88*100\)
符合題意。

程式碼:

int main(){
    int _=read;
    while(_--){
        ll n=read,k=read;
        ll t1=k*10+k;
        ll chushu=n/t1/10;
        ll yvshu=n%t1;
        if(yvshu%k) puts("NO");
        else{
            if(yvshu/k<=chushu) puts("YES");
            else puts("NO"); 
        }
    }   
    return 0;
}