E1. Asterism (Easy Version)——(组合数学)

    技术2022-08-10  97

    题意

    合法一种情况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个,累乘

    题目链接

    //#pragma GCC optimize(2) //#pragma GCC target ("sse4") #include<bits/stdc++.h> //typedef long long ll; #define ull unsigned long long #define int long long #define F first #define S second #define endl "\n"//<<flush #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); // freopen("D:/LSNU/codeforces/duipai/WA.txt","w",stdout); #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; }
    Processed: 0.014, SQL: 9