超时版
public class Solution {
public static int Range = (int)Math.Pow(10, 9) + 7;
public int SpecialPerm(int[] nums) {
int ans = 0;
for(int i = 0; i < nums.Length; i++)
{
Swap(ref nums[0], ref nums[i]);
Recursive(nums, 0, ref ans);
Swap(ref nums[0], ref nums[i]);
}
return ans % Range;
}
// 递归排列
private void Recursive(int[] nums, int leftInd, ref int ans) {
if(leftInd + 1 == nums.Length)
{
ans++;
return;
}
int startInd = leftInd + 1;
for(int i = startInd; i < nums.Length; i++)
{
// 如果不存在余数为0的情况直接跳过
if(nums[leftInd] > nums[i])
{
if(nums[leftInd] % nums[i] > 0)
{
continue;
}
}else
{
if(nums[i] % nums[leftInd] > 0)
{
continue;
}
}
Swap(ref nums[startInd], ref nums[i]);
Recursive(nums, startInd, ref ans);
Swap(ref nums[startInd], ref nums[i]);
}
}
// 交换
private void Swap(ref int num1, ref int num2) {
if(num1 == num2)
{
return;
}
num1 ^= num2;
num2 ^= num1;
num1 ^= num2;
}
}