反正晚上沒什麼事,吧排列搜索這道題也一併寫了吧。先看題目:
設數組a包含n個元素恰好是0..n - 1的一個排列,給定b[0],b[1],b[2],b[3]問有多少個0..n-1的排列a,滿足(a[a[b[0]]]*b[0]+a[a[b[1]]]*b[1]+a[a[b[2]]]*b[2]+a[a[b[3]]]*b[3])%n==k ?
輸入包含5個參數:N,K,B0,B1,B2,B3,其中 4<= N<12, 0 <= K,B0,B1,B2,B3 < N。
這道題雖然是兩星的,但是感覺比剛纔那個瓶子和硬幣的要難一些。
猛一看,被題目搞得暈頭轉向,(a[a[b[0]]]*b[0]+a[a[b[1]]]*b[1]+a[a[b[2]]]*b[2]+a[a[b[3]]]*b[3])%n==k
拐了兩道彎,所以,不能被題目牽着鼻子走,直接這樣看吧:(b[0]*a0+b[1]*a1.....)%n==k
這樣就清晰多了。
思路:
第一步求出b[0]......b[3]四個數要乘以哪四個數,得到的結果和符合公式,注意,這裏b[0]...b[3]可能有相等,所以,查找之前先要合併下
這四個數在區間[0~n)裏面,第一步就很容找到。
第二步:
將找到的四個數在數組a[n]中排序,關鍵就在這裏,排序的過程需要檢查,是否符合條件,舉例來說:比如n=10,b[0]=3,找到的第一個數a0=2,那麼就是將2依次放到a[10]數中的每個位置,對應的a[3]必須只想2所放的索引。比如,2放在a[0]=2,那麼就有a[3]=0;同時我們還可以很容的得到:
當a0 != b[0]時,a0在a[]數中中的索引不能是a0和b[0]
其實第二步就是將第一步求出的數排序,看看符合條件的有多少個,最後累加就得到答案了。
思路就是這樣的,代碼寫的有點囉嗦,感覺不太理想,提交上去,沒問題,通過了。