雙倍數 題解

2022-05-16 21:15:35 字數 1988 閱讀 1090

乙個p進製的n位數a,將a的最後一位放到最高位得到新的n位數b,如果滿足b = 2 * a(p進製下),那麼稱a為p進製下的雙倍數。現給出進製p,求該進製下的最小雙倍數m。

共k行,每行乙個整數pi,表示進製為pi。

共k行,每行乙個對應pi進製下最小的雙倍數mi,mi的每一位用乙個空格隔開。

2

35

0 1

11 23

資料組數n ≤ 200

進製數p ≤ 200

0可以做最高位(如樣例中2的最小雙倍數),但不能只有0。

對於進製n,每一位用0 ~ n - 1表示。

思路1:
對於每乙個mi,列舉位數,得到的第乙個滿足條件的數即使最小的p進製下的雙倍數。

思路2:
對於對於進製pi下的mi,列舉最後1位,列舉p次即可。得到結果後需要與目前答案進行大小比較。

特判:
有一類特殊情況我們可以直接輸出,就是進製數pi % 3 == 2時,最小雙倍數一定是(pi / 3) (pi / 3 * 2 + 1)。

思路1:
//skq_liao

#include using namespace std;

#define for(i, a, b) for (register int i = (a), i##_end_ = (b); i < i##_end_; ++i)

#define rof(i, a, b) for (register int i = (a), i##_end_ = (b); i > i##_end_; --i)

#define debug(...) fprintf(stderr, __va_args__)

const int maxn = 20005;

int a[maxn];

void cal(int n)

for(int i = 2; ; ++i) // 列舉位數

for(j, 1, n) // 列舉最後一位

if(a[i] == a[1] * 2 + a[0])//如果滿足條件,輸出並結束搜尋

}}int main()

思路2:
//misakamikoto

#include using namespace std;

#define for(i, a, b) for (register int i = (a), i##_end_ = (b); i < i##_end_; ++i)

#define rof(i, a, b) for (register int i = (a), i##_end_ = (b); i > i##_end_; --i)

#define debug(...) fprintf(stderr, __va_args__)

const int maxn = 20005;

int p;

int ans[maxn];

inline bool check(int x, int y)

inline int solve(int x)

for(int pos = 2;; ++pos)

for(j, 1, x)

if(check(pos, carry))

return pos + 1;

}}int main()

return 0;

}

此題難度不大,核心在於如何想到雙倍數的構造方法。

skq_liao 2017/06/25 10 : 15 於機房

雙倍數 題解

乙個p進製的n位數a,將a的最後一位放到最高位得到新的n位數b,如果滿足b 2 a p進製下 那麼稱a為p進製下的雙倍數。現給出進製p,求該進製下的最小雙倍數m。共k行,每行乙個整數pi,表示進製為pi。共k行,每行乙個對應pi進製下最小的雙倍數mi,mi的每一位用乙個空格隔開。2 350 1 11...

題解 最小公倍數計數

先考慮,sum x sum x ij gcd i,j le x 細節等會處理。sum sum sum i,j 1 其實這一步不用急著將其轉化為 mu 函式,有些時候形如 sum x gcd d,x 1 d 可以化成尤拉函式的形式。sum sum sum sum mu d sum sum mu d s...

Latex雙倍行距設定

elservier 上有的雜誌要求投稿必須是雙倍行距 type the whole manuscript with double line spacing laxtex文件中加上如下的語句就可以了.add at the beginning usepackage then switch between...