c311. PC:分組之塔

題目 Problem

題目連結:https://zerojudge.tw/ShowProblem?problemid=c311

敘述 Description

進到了這個房間,小風終於遇到第一個塔主,這個塔主精神有點疾病,他有超級多的部下,而他想要將這些人以91個人為單位分為一組,而多出來的人就要把他殺掉。
然而他實在是太懶惰了,不想要自己算要殺掉多少人,於是他命令小風幫他算出人數,否則第一個先死的就是小風了。
無奈小風的除法沒有學好,所以他算不出來。於是小風再次需要各位的幫忙,請算出塔主需要殺掉的人數。

輸入 Input

輸入有多筆測資,並以EOF作為結尾。
每一筆測資包含一個正整數n,代表塔主的部下人數。

10%的測資滿足n<=10^9
40%的測資滿足n<=10^18
100%的測資滿足n<=10^100000

輸出 Output

對於每一筆輸入 請輸出塔主需要殺掉的人數

範例輸入 Sample Input

1
2
3
92
93
91

範例輸出 Sample Output

1
2
3
1
2
0

提示 Hint

題解 Solution

如何判斷數字是不是$7$的倍數跟$13$的倍數
當然是打開 Google 查啊(X)

7的倍數:由個位數起每三位數字一節,各奇數節的和與偶數節的和相減,其差是7的倍數。
13的倍數:由個位數起每三位數字一節,各奇數節的和與偶數節的和相減,其差是13的倍數。
文字來源:https://leestar2018.blogspot.com/2016/09/113.html

把數字長度補到$3$的倍數就可以算了

反正數字都一樣,就直接 $mod\ 91$
(繳交後3秒,回傳結果:WA)
不好意思齁這三洨 —— 圖源:好色龍
後來想想,我忘了重要關鍵點,因為只是判斷7的倍數或13的倍數,可以不用管正負
但!如果是 $mod$ 就要區分正負關係了

正數正常 $mod\ 91$ 就好
負數要先 $mod\ 91$ 再加 $91$ 再 $mod\ 91$
不知道為什麼的人請去 Google 負數取模

程式碼 Accepted Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
#define _ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
int main(){
_
string enter;//192936162 55
while(cin>>enter){
int total=0;
int s=enter.length()%3;
if(s==1)
enter="00"+enter;
else if(s==2)
enter="0"+enter;
int p=0;
for(int i=enter.length()-3;i>=0;i-=3){
if(p%2){
total-=((enter[i]-'0')*100+(enter[i+1]-'0')*10+(enter[i+2]-'0'));
}
else{
total+=((enter[i]-'0')*100+(enter[i+1]-'0')*10+(enter[i+2]-'0'));
}
p++;
}
int mo=total%91;
if(total<0)
printf("%d\n",(91+mo)%91);
else
printf("%d\n",mo);

}
return 0;
}

後記 Afterword

異想不到的事,這題我是第一個 $0ms$ 完成
2018/09/03 截圖紀念
畢竟 ZeroJudge 有改版過
效能應該有提升
但,套用憲哥說的一句話
Who Cares? —— 影像版權:《綜藝大熱門》

不過我倒是好奇,畢竟這題曾經是比賽題
如果是在比賽期間,你要怎麼讓這題拿到AC呢?


c311. PC:分組之塔
https://blog.yangjerry.tw/2018/09/02/zj-c311/
作者
Jerry Yang
發布於
2018年9月2日
許可協議