只有20个点,从大到小排序然后枚举即可。这里做了一个优化,不模大于自己的数,因为这是徒劳的,我们要求的是最小的r。
注意:不排序就枚举是错误的,想一想,为什么。
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int INF = 99; 8 const int N = 20; 9 int x[N];10 int t, n, a, r;11 12 bool cmp( int p, int q )13 {14 return p > q;15 }16 17 void dfs( int d, int cur, int len )18 {19 if ( d == 0 )20 {21 r = min( r, len );22 return ;23 }24 if ( cur == n ) return ;25 if ( d >= x[cur] ) dfs( d % x[cur], cur + 1, len + 1 ); 26 dfs( d, cur + 1, len );27 }28 29 int main ()30 {31 cin >> t;32 while ( t-- )33 {34 cin >> n >> a;35 for ( int i = 0; i < n; i++ )36 {37 cin >> x[i];38 }39 sort( x, x + n, cmp );40 r = INF;41 dfs( a, 0, 0 );42 if ( r == INF ) r = -1;43 cout << r << endl;44 }45 return 0;46 }