題目 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)
正數正常 $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$ 完成

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