[2018.11.05 T1] 喝牛奶
暫無連結
喝牛奶
題目描述
這一天 正在喝牛奶。
的主人買來了 桶牛奶,第桶牛奶的重量是噸。由於主人心情不好,她隨機地把這些牛奶的順序打亂了,然後把它們丟給了。
會從第一桶牛奶開始喝,每次喝完一整桶牛奶,由於貓的消化能力及其強大,所以每當的肚子裡有噸牛奶時,他會開啟究極消化模式,把肚子中的牛奶清零。與此同時,在喝完每一桶牛奶後,他會記錄下自己肚子裡剩餘牛奶的重量,並從主人那裡領取一張寫著數字的卡片,顯然。
由於是一隻十分好學的好貓,在日復一日的喝牛奶活動中,他漸漸開始好奇,是否存在某一些給定牛奶的順序,使得可以集齊全部的 種卡片?
本來 想問你有多少種這樣的方案,但是由於他牛奶喝多了,自己也無法解決這個問題,所以,他現在準備請你給出一種或兩種可以使得他集齊所有卡片的給定牛奶的順序。
一句話題意: 請構造兩個 的排列,使得在模意義下對這個排列進行字首和操作後,中的每個數在新的序列中都出現了一次。如果沒有這樣的排列,請輸出。
輸入格式
一個正整數 。
輸出格式
第一行一個數字: 或或 。
如果你輸出了,則代表你認為不存在這樣的排列。
如果你輸出了,則代表你即將輸出一個這樣的排列。
如果你輸出了,則代表你即將輸出兩個這樣的排列。
如果你在第一行輸出了或,那麼你需要輸出 ( 一行,一個的排列 ) 或 (兩行,兩個不相同的的排列) 。
資料保證如果存在這樣的排列,則至少有兩個合法的排列。
輸入樣例
6
輸出樣例
2 6 2 5 3 1 4 6 5 2 3 4 1
資料範圍
對於的資料,保證
對於的資料,保證
對於的資料,保證
評分標準
本題使用 進行評測。 如果你的輸出不符合輸出格式或者答案錯誤,那麼你將獲得本測試點 的分數。 如果你輸出了一個正確排列和一個錯誤排列,那麼你將獲得本測試點 的分數。 如果你只輸出了一個正確排列,那麼你將獲得本測試點 的分數。 如果你的程式正確地輸出了結果,那麼你將獲得本測試點 的分數。 如果你的程式導致 出現異常,那麼你將會獲得該測試點 的分數(包括但不僅限於輸出的東西不是一個排列、第一行輸出了奇怪的東西、輸出的排列中加入了奇怪的字元等)
題解
可能需要打表找一找規律?
由於題目保證如果有答案的話至少有兩個合法排列,所以我們不用考慮的情況,直接看的。
首先,如果放在排列中間,那麼肯定會有兩個一樣的字首和,所以一定要放在開頭。
當為奇數時,由於一定在第一個,所以後面一定有兩個重複的數,輸出。
那麼只剩為偶數的情況,為了讓模意義下的字首和不重不漏,不妨將數兩兩分為一組,使每一組和為:
第二組的話,我們可以讓每組的數字和為:
程式碼
#include<cstdio>
int n;
void in(){scanf("%d",&n);}
void ac()
{
if(n&1){puts("-1");return;}
printf("2\n%d ",n);for(int i=1;i<n-1;i+=2)printf("%d %d ",n-i,i+1);puts("1");
printf("%d ",n);for(int i=1;i<n-1;i+=2)printf("%d %d ",i,n-i-1);printf("%d",n-1);
}
main(){in(),ac();}