---
# System prepended metadata

title: '[109-cpi] HW2'
tags: [' 109', ' cpi', homework]

---

---
tags: homework, 109, cpi
title: '[109-cpi] HW2'
---

# Homework 2
> Week 3 (9/28), Due: 10/5 09:00:00

* 範圍：Operation
* NOJ 

## 大小姐的生日禮物
> [name=博傑]

### 敘述

最近又快到了大小姐的生日了，學生會的其他三人決定要一起集資，派出與大小姐相識已久的書記去買禮物替大小姐慶祝，不過就在禮物買回來後，禮物的價格卻與本來的預算差了 $n$ 元，所以需要退錢或是再跟大家收錢。  
不過要計算這麼複雜的數學對於 IQ 只有 3 的書記來說實在是太困難了，請你寫個程式來幫書記計算，每個人需要再付或是可以拿回多少錢，以及最後剩下的金額。

### 測資說明

#### Input

輸入僅一個整數 $n$，代表的是與本來預算的差距金額。  
其中 $-100 \le n \le 100$

#### Output

請輸出兩個數字 $q, r$ 於一行，並以一個空白隔開  
$q$ 表示大家需要付出或是可以拿回多少錢  
$r$ 表示最後會多出多少錢

### Example Input 0

```
7
```

### Example Output 0

```
2 1
```

### Example Input 1

```
-5
```

### Example Output 1

```
-2 1
```

### Hint

- 以第一筆範例測資 $n=7$ 來說，因為剩下了七塊錢，每人可以拿回兩元，最後會剩下一元充公，因此要輸出 `2 1`。
- 第二筆範例測資 $n=-5$ 代表不夠五塊錢，所以每人要再付兩元，並且最後會多出一元充公，因此要輸出 `-2 1`。

---

## 桌遊部的各位
> [name=映達]

### Description

槙前辈、書記、Giga 子三人皆是桌遊部的成員，平時最喜歡玩各式各樣的桌遊，甚至將整個校園當做遊戲的地圖。今天，不，不只今天，每當她們玩桌遊前，經常需要先煩惱一件事：誰可以先手？

該桌遊部自古流傳著一句話：「千花的千，是老千的千」。猜拳，雖然只能算是桌遊開始前的準備，可以決定玩家的先後順序。但其本質仍然是一種遊戲；既然是遊戲，當然會有人為了勝負不擇手段、甚至作弊！

為了公平起見，請你寫一支程式，來幫助桌遊部的各位判定猜拳的勝負吧！

### Input

有三個整數，$x_0$、$x_1$、$x_2$ 依序代表槙前辈、書記、Giga 子的選擇。數字對應的意義為：

0. 剪刀
1. 石頭
2. 布

### Output

若結果出現**唯一**一位贏家，則輸出該玩家編號：

0. 槙前辈
1. 書記
2. Giga 子
 
否則輸出 $-1$。

（這是當然的，因為我們要選出先手的那**一位**玩家。若有兩位贏家出現，相當於尚未得到結果。）

### Example Input 0

```
0 2 2
```

### Example Output 0

```
0
```

### Example Input 1

```
0 0 2
```

### Example Output 1

```
-1
```

### Hint

1. 善用餘數找規律
2. 拿出紙筆算算看

對於所有輸入，$x_0, x_1, x_2 \in \{0, 1, 2\}$。

#### Subtask 1: 95%

輸入保證出現恰好一位贏家。

#### Subtask 2: 5%

無其他限制。

> 一些優秀的同學大概會想到可以用 if 來解。但在老師還沒教到條件選擇的情況下，這題有辦法解嗎？答案是肯定的。事實上對於 95% 的測資（必定恰好一位贏家的情況），用 if 寫未必比較簡單：
> ```c
> #include <stdio.h>
> 
> int main() {
>     int x = 0, y = 0, z = 0;
>     scanf("%d %d %d", &x, &y, &z);
> 
>     // 如果不知道取模運算（%），一樣可以用國小教的方法算出餘數
>     int d = y - z + 3;
>     int winner = d - 3*(d / 3);
>     // 上面兩行相當於
>     // int winner = (y - z + 3) % 3;
> 
>     printf("%d\n", winner);
> }
> ```
> 處理答案有 $-1$ 的情況（5%）：
> ```c
> #include <stdio.h>
> 
> int main() {
>     int x = 0, y = 0, z = 0, d = 0;
>     scanf("%d %d %d", &x, &y, &z);
> 
>     // int a = (x - y + 3) % 3;
>     d = x - y + 3;
>     int a = d - 3*(d / 3);
> 
>     // int b = (y - z + 3) % 3;
>     d = y - z + 3;
>     int b = d - 3*(d / 3);
> 
>     // int c = (a - b + 3) % 3;
>     d = a - b + 3;
>     int c = d - 3*(d / 3);
> 
>     // Magic
>     int winner = b - (b + 1)*(c - 1)*(c - 1);
>     printf("%d\n", winner);
> }
> ```
> 我預設第一子題組應該不難想，因為要縮小「會 if」和「不會 if」的人間分數的差距，所以第二子題組只給了 5 分。

---

## 謎底揭曉
> [name=育辰]

### Description
$\text{Willy}$ 沈迷一款解謎遊戲，他進入到一個雪地，並用鏟子挖掘後發現一個神秘的盒子，打開後只寫著一個整數 $n$。

回到主畫面，意外發現紅色門的門把上刻了數字 $S_1$，以及天花板與牆角的縫隙也寫了一數字 $S_2$。

到了一個隱密的場景，有個沖天炮被一數字鎖鎖著，其共有 $8$ 位數，在上頭放置有 $h_1$ 小時、 $m_1$ 分鐘、$s_1$ 秒數的時鐘，下頭亦放置類似的時鐘，時間未必相同，其時、分、秒依序為 $h_2, \, m_2, \, s_2$。

因為怎麼解都解不開，於是偷偷去 $\text{Youtube}$ 看了攻略...

![](https://i.imgur.com/jRfHKu1.jpg)

**攻略大秘籍**
1. $n$ 表示最大可接受的數值，若今後得到一數值 $n+1$，則從 $0$ 開始繼續計算，若數值小於 $0$ 則從 $n$ 往下倒數：
   > 例如： $n = 1000$
   > * $1001$ 則結果為 $0$
   > * $5342$ 則結果為 $337$
   > * $-200$ 則結果為 $801$
2. 計算 $S_1 - S_2$，並以攻略第一步中的 $n$ 去計算結果 $A_1$
3. 接著計算 由上方的開始時間，到下方的結束間所經過的**秒數**，並以單位**秒**表示，結束時間不會早於開始時間，且不會到隔天。
4. 將第三步驟所得之結果加上 $A_1$，其數值再以攻略第一步之方式計算最後結果，最終數值即為密碼鎖之答案，若有空格處則補 $0$

請你按照攻略寫出一個程式幫助 $\text{Willy}$ 破關吧！！

### Input
$\text{Line 1: }$ 一整數 $n$\
$\text{Line 2: }$ 兩個整數 $S_1, \, S_2$，以空格間隔\
$\text{Line 3: }$ 三個整數 $h_1, \, m_1, \, s_1$，以空格間隔\
$\text{Line 4: }$ 三個整數 $h_2, \, m_2, \, s_2$，以空格間隔

**limit**
* $1 \leq n \leq 2 \times 10^{5}, \, n \in \mathbb{N}$
* $0 \leq S_1, S_2 \leq 2^{30}, \ S_1, S_2 \in \mathbb{N}$
* $0 \leq h_1 \leq h_2 < 24, \  h_1, h_2 \in \mathbb{N}$
* $0 \leq m_1, m_2 < 60, \ m_1, m_2 \in \mathbb{N}$
* $0 \leq s_1, s_2 < 60, \ s_1, s_2 \in \mathbb{N}$
* $| \, \text{經過的時間} + (S_1 - S_2) \, | \leq (1000 \times n + 1000)$


### Output
$\text{Line 1: }$ 一整數 $A$，即密碼鎖密碼，需換行，且共八位數，不足需補零

### Example Input
    1000
    2800 4200
    4 5 30
    23 59 59

### Example Output
    00000199

### Hint
* 善用`+` `-` `x` `/` `%`運算
* **經過的秒數**是求 **開始時間到結束時間，中間共經過幾秒**，而非最短時間差，此外第二個時間不會到隔天 (滿足 $h_1 \leq h_2 < 24$)



### Subtask

#### Subtask 1: 25%
$0 \leq \text{經過的秒數} \ + \  (S_1 - S_2) \leq n$

#### Subtask 2: 35%
$0 \leq \text{經過的秒數} \ + \ (S_1 - S_2)$

#### Subtask 3: 40%
無其他限制

* [測資載點](https://drive.google.com/open?id=1GvLH1YFqDKnh3yT9Lf8lNjM0kdo-5rFi&authuser=40771131h%40gapps.ntnu.edu.tw&usp=drive_fs)

---


## Chicken, Rabbit, and Crab in a Cage 
> [name=Judge Girl]

### Description
有雞、兔子和螃蟹在同一個籠子裡，先不論其是否會打架，是否會履行其生態鏈的角色，我們先假設他們暫時忘卻本能，直到你的程式運行完畢，輸出正確結果後，不用再管他們的生或死...

承上，現給定這些動物的總數($s$)、動物腳的總數($f$)以及動物尾巴的總數($t$)，請依序輸出雞、兔子、螃蟹的數量。

* **給定的數字保證有解**


### Input
* $\text{Line} \, 1$: 三個整數以空格分隔，依序為 $s, \,  f, \, t$

#### Limit
* $0 \leq s, \, f, \, t \leq 2^{31} -1$


### Output
* $\text{Line} \, 1$: 一整數 $A_{1}$ 表示**雞**的數量
* $\text{Line} \, 2$: 一整數 $A_{2}$ 表示**兔子**的數量
* $\text{Line} \, 3$: 一整數 $A_{3}$ 表示**螃蟹**的數量

### Example Input

    9 48 5


### Example Output

    2
    3
    4


### Hint

* 在本題中，雞預設為2隻腳, 1尾巴，兔子為4隻腳, 1尾巴，螃蟹為8隻腳（不算螯足)


> from `Judge Girl`

* [測資載點(已包好)](https://drive.google.com/file/d/1GnYuxfIKV0lZCX3z13RQRUsr2VdM9U9W/view?usp=sharing)

---


## Surface Area and Volume of a Box 
> [name=Judge Girl]

### Description

請寫出一個程式，給定 $a, \, b, \, c, \, d, \, e$，並參考下圖輸出其表面積和體積。

![](https://i.imgur.com/QBY8sPY.png)



### Input

* $\text{Line} \, 1 \text{~} 5$: 分別為 $a, \, b, \, c, \, d, \, e$，皆為整數


### Output

* $\text{Line} \, 1$: 表面積 $P, \ P \in \mathbb{P}$
* $\text{Line} \, 2$: 體積 $V, \ V \in \mathbb{N}$ 


### Example Input

    6
    8
    10
    1
    2
   


### Example Output

    472
    392


### Hint
* 中間為**實心**，六面向**內凹**

> from `Judge Girl`

* [測資載點(已包好)](https://drive.google.com/file/d/1GmUpzBg4xFMHUfTAw9YxZ_E7wAqpRYtU/view?usp=sharing)

---


## Divide & Conquer
> [name=(前) Algo 助教 - Uier]

Divide 是四則運算中的其中一種
隨便啦題敘你們自己想
題名我覺得蠻棒的可以留著

Input:
兩個整數，代表被除數和除數

Output:
輸出兩行
第一行：做除法的結果，四捨五入到小數點第二位，或預設的顯示，隨便
第二行：做除法的結果，但是格式是 `Q ... R`，其中 Q 是商數 R 是餘數

範例測資可以有一個負數的 讓他們知道 C 餘數的特性

> 感謝！博傑已出在題目內了~
> [name=mathlin]