問題進入
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...