#26689: 解題思路


fire5386 (becaidorz)

學校 : 國立清華大學
編號 : 115822
來源 : [140.114.217.8]
最後登入時間 :
2024-04-13 22:06:23
g183. 81倍數判別 | From: [111.243.29.93] | 發表日期 : 2021-08-20 17:43

用python或是java這種支援大數運算的很簡單 但我們今天要討論如何用c/c++解題

想想3的倍數是如何判斷的,把每個位數相加,如果是3的倍數,該數就是3的倍數

但背後的原理是甚麼?

12345可以看成1 * 10^4 + 2 * 10^3 + 3 * 10^2 + 4 * 10^1 + 5 * 1

我們要計算12345 mod 3是否等於0就等於在問1 * 10^4 + 2 * 10^3 + 3 * 10^2 + 4 * 10^1 + 5 * 1 mod 3 有沒有 = 0

這時候我們可以運用同餘的特性簡化算式:1 * (9 + 1)^4 + 2 * (9 + 1)^3 + 3 * (9 + 1)^2 + 4 * (9 + 1)^1 + 5 * 1

=> 1 * (0 + 1)^4 + 2 * (0 + 1)^3 + 3 * (0 + 1)^2 + 4 * (0 + 1)^1 + 5 * (0 + 1) = 1 + 2 + 3 + 4 + 5

會發現很多9..的那邊會因為同餘3被削去,因此只剩下每個位數相加是不是3的倍數要判斷

那要怎麼把這個原理套用到81呢?

首先,要先知道1000000000(10^9) mod 81 = 1(用計算機按出來的)

接下來就可以把剛剛的原理把套用到這題上

1234567890987654321 = 1 * 1000000000^2 + 234567890 * 1000000000^1 + 987654321 mod 81 = ?

運用同餘:1 * (... + 1)^2 + 234567890 * (... + 1)^1 + 987654321 mod 81 = ?

=> 1 + 234567890 + 987654321 mod 81 = ?

可以發現就是每九數字相加判斷是不是81的倍數

 
#26690: Re:解題思路


fire5386 (becaidorz)

學校 : 國立清華大學
編號 : 115822
來源 : [140.114.217.8]
最後登入時間 :
2024-04-13 22:06:23
g183. 81倍數判別 | From: [111.243.29.93] | 發表日期 : 2021-08-20 17:47

完整程式碼:

https://66lemon66.blogspot.com/2021/08/zerojudge-g183-81-c.html

 
#26810: Re:解題思路


xu6mp3vu6@gmail.com (vega)

學校 : 不指定學校
編號 : 99895
來源 : [101.9.225.51]
最後登入時間 :
2019-09-25 10:08:52
g183. 81倍數判別 | From: [101.9.44.66] | 發表日期 : 2021-08-26 05:19

用python或是java這種支援大數運算的很簡單 但我們今天要討論如何用c/c++解題

想想3的倍數是如何判斷的,把每個位數相加,如果是3的倍數,該數就是3的倍數

但背後的原理是甚麼?

12345可以看成1 * 10^4 + 2 * 10^3 + 3 * 10^2 + 4 * 10^1 + 5 * 1

我們要計算12345 mod 3是否等於0就等於在問1 * 10^4 + 2 * 10^3 + 3 * 10^2 + 4 * 10^1 + 5 * 1 mod 3 有沒有 = 0

這時候我們可以運用同餘的特性簡化算式:1 * (9 + 1)^4 + 2 * (9 + 1)^3 + 3 * (9 + 1)^2 + 4 * (9 + 1)^1 + 5 * 1

=> 1 * (0 + 1)^4 + 2 * (0 + 1)^3 + 3 * (0 + 1)^2 + 4 * (0 + 1)^1 + 5 * (0 + 1) = 1 + 2 + 3 + 4 + 5

會發現很多9..的那邊會因為同餘3被削去,因此只剩下每個位數相加是不是3的倍數要判斷

那要怎麼把這個原理套用到81呢?

首先,要先知道1000000000(10^9) mod 81 = 1(用計算機按出來的)

接下來就可以把剛剛的原理把套用到這題上

1234567890987654321 = 1 * 1000000000^2 + 234567890 * 1000000000^1 + 987654321 mod 81 = ?

運用同餘:1 * (... + 1)^2 + 234567890 * (... + 1)^1 + 987654321 mod 81 = ?

=> 1 + 234567890 + 987654321 mod 81 = ?

可以發現就是每九數字相加判斷是不是81的倍數

首先謝謝版主分享解法

我是從頭開始除 除到尾看餘數 畢竟要知道10^9 mod 81 = 1好像有點通靈成分...

 
ZeroJudge Forum