# 題目
* 給你兩個整數 N (0<N<=10000), M (0<M<=10000),你要依照某些規則排序N個整數。先利用每個數字除以M的餘數由小到大排,若排序中比較的兩數為一奇一偶且兩數除以M 的餘數相等,則奇數要排在偶數前面。若兩奇數除以M餘數大小相等,則原本數值較大的奇數排在前面。同樣的,若兩偶數除以M餘數大小相等,則較小的偶數排在前面。至於負數的餘數計算和 C 語言裡的定義相同,即負數的餘數絕對不會大於零。例如 -100 MOD 3 = -1, -100 MOD 4 = 0 依此類推。
> [題目連結請點此](https://onlinejudge.org/external/113/11321.pdf)
# 思路
把資料都封裝到容器vector中,因為vector排序相對容易實現且穩定,排序的順序是 `依照餘數建立區塊(升冪)` -> `專注到區塊中實現區塊內排序(奇數在偶數前)` -> `奇數以降冪排序` -> `偶數以升冪排序` -> `結束排序`,直接輸出排序好的vector即可完成題目。
# CODE
```C++=1
#include <iostream>
#include <vector>
#include <algorithm>
using sv=std::vector<int>;
class Solution
{
int N, M;
sv ans;
private:
// 依據排序的規則排序,(餘數升冪、(奇數降冪、偶數升冪))。
void vec_sort(sv& v)
{
std::sort(v.begin(),v.end(),[this](const int& a, const int& b){
int AM=a%M, BM=b%M;
if(AM==BM)
{
if(a%2==0&&b%2==0)
return b>a;
if(a%2!=0&&b%2!=0)
return a>b;
return a%2!=0;
}
return BM>AM;
}
);
}
// 讀取測資到容器vector
sv vec_input()
{
sv tem(N);
for(int i=0;i<N;++i)
std::cin>>tem[i];
return tem;
}
public:
// 運用構造函式將N,M的數值轉移到class中
Solution(int n, int m):N(n), M(m)
{
printf("%d %d\n",N,M);
}
// 印出輸出答案
void showanswer()
{
ans=vec_input();
vec_sort(ans);
for(int i:ans)
printf("%d\n",i);
}
};
int main()
{
int N, M;
//運用while使程式可以處理多case
while(std::cin>>N>>M,N)
{
Solution solution(N,M);
solution.showanswer();
}
printf("0 0\n");
}
```
# 參考網站
1. [高中生程式解題系統](https://zerojudge.tw/ShowProblem?problemid=d750)
2. [瘋狂程設](http://coding-frenzy.arping.me/)