反正晚上没什么事,吧排列搜索这道题也一并写了吧。先看题目:
设数组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]
其实第二步就是将第一步求出的数排序,看看符合条件的有多少个,最后累加就得到答案了。
思路就是这样的,代码写的有点啰嗦,感觉不太理想,提交上去,没问题,通过了。
原文:http://blog.csdn.net/mamihong/article/details/19048677