题意
合法一种情况x+i>=ai( i∈[0,n-1] ) f(x)=所有可能的合法方案数 输出f(x)不能被p整除的所有x
解析
x的上界是多少?(枚举) 由于p<=n且为素数 max(ai)<=x时,f(x)=n!,存在质因子p,并且以后的f(x)都会被p整除 ai<=2e3,暴力枚举
f(x)方案数如何计算(组合数) 由于xi>=ai,我们只需要看每个位置可以放多少个合法的数(sort+二分) 但是由于前面的数,已经用过j个,每个位置只能放cnt-j个,累乘
题目链接
#include<bits/stdc++.h>
#define ull unsigned long long
#define int long long
#define F first
#define S second
#define endl "\n"
#define eps 1e-6
#define base 131
#define lowbit(x) (x&(-x))
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define MAXN 0x7fffffff
#define INF 0x3f3f3f3f3f3f3f3f
#define ferma(a,b) pow(a,b-2)
#define mod(x) (x%mod+mod)%mod
#define pb push_back
#define decimal(x) cout << fixed << setprecision(x);
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define memset(a,b) memset(a,b,sizeof(a));
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std
;
template
<typename T
> inline T
fetch(){T ret
;cin
>> ret
;return ret
;}
template
<typename T
> inline vector
<T
> fetch_vec(int sz
){vector
<T
> ret(sz
);for(auto& it
: ret
)cin
>> it
;return ret
;}
template
<typename T
> inline void makeUnique(vector
<T
>& v
){sort(v
.begin(), v
.end());v
.erase(unique(v
.begin(), v
.end()), v
.end());}
void file()
{
#ifdef ONLINE_JUDGE
#else
freopen("D:/LSNU/codeforces/duipai/data.txt","r",stdin);
#endif
}
signed main()
{
IOS
;
file();
int n
,p
;
cin
>>n
>>p
;
vector
<int>vec(n
),ans
;
for(auto &it
:vec
)
cin
>>it
;
sort(all(vec
));
for(int i
=1;i
<=2e3;i
++)
{
int num
=1;
for(int j
=0;j
<n
;j
++)
{
int xi
=i
+j
;
int cnt
=upper_bound(all(vec
),xi
)-vec
.begin();
num
=num
*(cnt
-j
)%p
;
}
if(num
)
ans
.pb(i
);
}
cout
<<ans
.size()<<endl
;
for(auto it
:ans
)
cout
<<it
<<" ";
cout
<<endl
;
return 0;
}