藍橋杯訓練 k進製數的數字交換問題

2021-10-03 03:51:39 字數 1646 閱讀 6135

問題進入

k

kk進製數的數字交換問題,就是給出乙個k

kk進製的數,求出其中任意兩個數字交換後的大小

我們先以十進位制數123

12312

3為例,假如交換第一位和第二位變成213

21321

3。那麼這兩個數之間存在什麼關係呢,我們注意到百位上本來是1

11,變成了2

22之後原數就要增加(2−

1)

∗100

(2-1)*100

(2−1)∗

100;十位上本來是2

22,變成1

11之後原數就要增加(1−

2)∗10

(1-2)*10

(1−2)∗

10。那麼再考慮交換前左邊的數小於右邊的數,就變成了減的較多。總之,拿每一位變化後的數減去變化前的數再乘以該位的權值,不必去考慮誰大誰小,二者相加即是原數變化的值。

我們得出了,假如乙個k

kk進製數n

nn(n

nn是轉換為十進位制的大小)的第i

ii位和第j

jj位(i

ii在j

jj左邊)交換,其數字對應權值分別為a[i

]a[i]

a[i]

和a [j

]a[j]

a[j]

。那麼交換後的十進位制m=(

i−j)

∗a[j

]+(j

−i)∗

a[j]

m=(i-j)*a[j]+(j-i)*a[j]

m=(i−j

)∗a[

j]+(

j−i)

∗a[j

] 其中數字權值陣列這樣初始化:

int a[maxn]

;int p;

//對p取模,因為每一位可能很大

void

init

(string s,

int k)

}

例題解析

題目鏈結

這道題是我做藍橋杯練習時碰到的,之前沒注意過這類題,第一次我寫的是直接交換,每次去求乙個串的值,但是只過了一半的測試,超時了。顯然數字交換和求字串值那裡超時了。那怎麼優化呢?看了網上,才知道要用到上面提到的數字交換後數的大小變化的性質,簡單研究了一番,便知道怎麼解決這類問題了。寫篇部落格加深印象,這種題也可能作為icp

cicpc

icpc

的簡單題來出。

#include 

#include

#include

using namespace std;

string s;

int p;

int a[

2010];

void

init()

}int

solve

(string str)

return tmp;

}int

main()

else}if

(exit)

break;}

}if(flag)

printf

("-1 -1\n");

return0;

}

藍橋杯 K 進製數

時間限制 1sec 記憶體限制 128mb 提交 152 解決 46 題目描述 考慮包含n位數字的k 進製數.定義乙個數有效,如果其k 進製表示不包含兩連續的0.考慮包含n位數字的k 進製數.定義乙個數有效,如果其k 進製表示不包含兩連續的0.例 1010230 是有效的7位數 1000198 無效...

藍橋杯 K 進製數

題目描述 考慮包含n位數字的k 進製數.定義乙個數有效,如果其k 進製表示不包含兩連續的0.考慮包含n位數字的k 進製數.定義乙個數有效,如果其k 進製表示不包含兩連續的0.例 1010230 是有效的7位數 1000198 無效 0001235 不是7位數,而是4位數.給定兩個數n和k,要求計算包...

藍橋杯K進製數題解

考慮包含n位數字的k 進製數.定義乙個數有效,如果其k 進製表示不包含兩連續的0.例 1010230 是有效的7位數 1000198 無效 0001235 不是7位數,而是4位數.給定兩個數n和k,要求計算包含n位數字的有效k 進製數的總數.假設2 k 10 2 n 4 n k 18.這個題應該是乙...