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

92
93
91

範例輸出 Sample Output

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

#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呢?