k進製數交換

2021-10-03 05:49:55 字數 1382 閱讀 2756

問題進入

k進製數的數字交換問題,就是給出乙個k進製的數,求出其中任意兩個數字交換後的大小

我們先以十進位制數123為例,假如交換第一位和第二位變成213。那麼這兩個數之間存在什麼關係呢,我們注意到百位上本來是1,變成了2之後原數就要增加(2-1)*100;十位上本來是2,變成1之後原數就要增加(1-2)*10。那麼再考慮交換前左邊的數小於右邊的數,就變成了減的較多。總之,拿每一位變化後的數減去變化前的數再乘以該位的權值,不必去考慮誰大誰小,二者相加即是原數變化的值

我們得出了,假如乙個k進製數n(n是轉換為十進位制的大小)的第i位和第j位(i在j左邊)交換,其數字對應權值分別為a[i]和a[j]。那麼交換後的十進位制m=(i-j)*a[j]+(j-i)*a[j]

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

int a[maxn];

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

void init(string s,int k)

123

4567

89

例題解析

題目鏈結

有乙個長度為 l 的字串,每個字元是大寫字母。如果我們把 a 看做 0 ,bb 看做 1 ,c 看做 2 … z 看做 25,那麼我們就得到了乙個 26 進製的數字串。我們可以對這個字串做乙個操作:將兩個位置的字母進行交換。這樣得到了乙個新的數字串。現在有乙個十進位制整數 m ,請判斷是否可以通過做至多一次(可以不做)操作,使得得到的字串是 m 的倍數

輸入格式

第一行乙個只包含大寫字母的字串

第二行乙個整數 m

輸出格式

如果初始串就可以,那麼輸出 「0 0」(不加引號)。如果通過一次操作可以,請輸出交換的兩個位置的標號(標號小的在前,從 1 開始)。如果有多解,輸出字典序最小的。如果做不到,那麼輸出 「-1 -1」(不加引號)

資料範圍

字串長度為 l

對於 30% 的資料:1≤l≤10,1≤m≤100

對於 50% 的資料:除前面 30% 外, 1≤l≤500,m=5 或 25 或 26

對於 100% 的資料:1≤l≤2,000,1≤m≤200,000

#include#includeusing namespace std;

const int n=2010;

int a[n];

int n;

string s;

void init()

}int main()

else}if

(flag) break;}}

if(!flag)

printf

("-1 -1\n");

return 0;

}

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

問題進入 k kk進製數的數字交換問題,就是給出乙個k kk進製的數,求出其中任意兩個數字交換後的大小 我們先以十進位制數123 12312 3為例,假如交換第一位和第二位變成213 21321 3。那麼這兩個數之間存在什麼關係呢,我們注意到百位上本來是1 11,變成了2 22之後原數就要增加 2 ...

藍橋杯 K 進製數

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

2 k進製數

遞推 高精度 f i j 表示共i位且最高位是j的方案數,顯然有只要上一位比它大就可以轉移,所以有f i j f i 1 j 1 f i 1 2 k i 1 也就是f i j f i j 1 f i 1 j 最後特判一下最後一段剩下的w k的就可以。注意高精 include using namesp...