問題進入
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.這個題應該是乙...