51Nod 1116 K進製下的大數 數學

2021-08-07 12:58:59 字數 1503 閱讀 2948

傳送門

有乙個字串s,記錄了乙個大數,但不知這個大數是多少進製的,只知道這個數在k進製下是k - 1的倍數。現在由你來求出這個最小的進製k。

例如:給出的數是a1a,有a則最少也是11進製,然後發現a1a在22進製下等於4872,4872 mod 21 = 0,並且22是最小的,因此輸出k = 22(大數的表示中a對應10,z對應35)。

input

輸入大數對應的字串s。s的長度小於10^5。

output

輸出對應的進製k,如果在2 - 36範圍內沒有找到對應的解,則輸出no solution。

input示例

a1aoutput示例

22

習題的第一題,是比較好的思路。

雖然本次題目中沒有用到數論的知識。

但是遇到數相關的題目,凡是提到了

k k

以及k−1

' role="presentation">k−1

k−1,就往尤拉公式,費馬小定理上想。

這題目中

假設s是p進製的數。那麼: sm

od(p

−1) smo

d(p−

1)

=(s[0]∗

pn+s

[1]∗

pn−1

+...

+s[n

−1]∗

p0)m

od(p

−1) =(s

[0]∗

pn+s

[1]∗

pn−1

+...

+s[n

−1]∗

p0)m

od(p

−1

)=(s

[0]+

s[1]

+...

+s[n

−1])

mod(

p−1)

= (s

[0]+

s[1]

+...

+s[n

−1])

mod(

p−1)

因為p%

(p−1

) p%(

p−1)

= 1。

所以判斷各個位數上加起來能否被p-1整除就好了,若能整除答案就是p。

#include

#include

#include

#include

using

namespace

std;

#define max_int(a,b) (a>b)? a:b

char s[100005];

int char2int(char a)

int main ()

}if(flag == 0)

printf("no solution\n");

}

費馬小定理!

51NOD 1116 K進製下的大數

1116 k進製下的大數 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 收藏關注 有乙個字串s,記錄了乙個大數,但不知這個大數是多少進製的,只知道這個數在k進製下是k 1的倍數。現在由你來求出這個最小的進製k。例如 給出的數是a1a,有a則最少也是11進製,然後...

51nod1116 K進製下的大數

1116 k進製下的大數 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 有乙個字串s,記錄了乙個大數,但不知這個大數是多少進製的,只知道這個數在k進製下是k 1的倍數。現在由你來求出這個最小的進製k。例如 給出的數是a1a,有a則最少也是11進製,然後發現a1a...

51 Nod 1116 K進製下的大數

1116 k進製下的大數 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 有乙個字串s,記錄了乙個大數,但不知這個大數是多少進製的,只知道這個數在k進製下是k 1的倍數。現在由你來求出這個最小的進製k。例如 給出的數是a1a,有a則最少也是11進製,然後發現a1a...