注:雖然沒有通過測試,但學會了用遞歸實現全排序的方法(話說此題的通過率真低呀,哪位高手知道正確答案呢?)
但剛才用gcc測了下,當N=11時,運行時間為2.3s(我的機子是linux mint 16 64bit, 酷睿雙核),之前在windows上跑要7、8s呢
題目詳情:
設數組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。
解題代碼:
#include#define MAX_N 11 int a[MAX_N] = {0}; int g_count = 0; int g_N; int g_K; int g_B0; int g_B1; int g_B2; int g_B3; // swap a[i] and a[offset] void swap(int i, int offset) { int temp = a[i]; a[i] = a[offset]; a[offset] = temp; } // find permutation (全排列) void perm(int offset) { if (g_N-1 == offset) { g_count += (a[a[g_B0]]*g_B0 + a[a[g_B1]]*g_B1 + a[a[g_B2]]*g_B2 + a[a[g_B3]]*g_B3)%g_N==g_K; return; } else { int i; for (i = offset; i < g_N; ++i) { swap(i, offset); perm(offset + 1); swap(i, offset); } } } int howmany (int N,int K,int B0,int B1,int B2,int B3) { g_N = N; g_K = K; g_B0 = B0; g_B1 = B1; g_B2 = B2; g_B3 = B3; // init array a int i; for (i = 0; i < N; ++i) { a[i] = i; } perm(0); return g_count; }
// 該段代碼可能在龐果上編譯不過(龐果你又調皮了),把報錯的那個局部變量改為全局變量即可。
原題地址:http://hero.pongo.cn/Question/Details?ID=292&ExamID=287