枚举 x x x,从小到大, x x x的上界是 m a x { a [ i ] } max\left \{ a[i] \right \} max{a[i]} 先对 a a a数组进行排序,之后,针对每个 x x x:
枚举每个位置 i i i上可以选择的方案数 v [ i ] v[i] v[i],这里参考代码进行理解最后以 x x x开始的枚举方案总数= ∏ i = 0 n v [ i ] \prod_{i=0}^{n}v[i] ∏i=0nv[i] void E1() { int n, p; cin >> n >> p; vector<int> a(n, 0); int ma = 0; for(int i = 0; i < n; i++) { cin >> a[i]; ma = max(ma, a[i]); } sort(a.begin(),a.end());//进行一个排序 vector<int> res; for(int i = 1; i <= ma; i++) { int pnt = 0; ll ans = 1; //枚举位置,在该位置上可以有多少个数可以选择。 for(int j = 0; j < n; j++) { while(pnt < n && i + j >= a[pnt]) pnt++; ans = (ans * (pnt - j) % p); //在该位置可以选择排列的个数,需要-j(前面已经用掉的数) } if(ans != 0) //说明没有被p整除 res.push_back(i); } cout << res.size() << endl; for(auto i : res) { cout << i << " "; } cout << endl; }