cf 1371 E1. Asterism (Easy Version)

题目

输入n,m,再输入n个a[i]。求有多少个x,能满足x+i>=a[i]中a[i]全排列的个数%m!=0

思路

令a[i]中最大的数为max
如果x>=max,那么每次能满足的都是m! m!%m=0,即x<m
如果x+n-1<max,那么到max的时候刚好不能满足x>max。即x>=max-n+1
然后在x的取值范围之内求即可

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
int a[2010];
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+1+n);
	int cnt=0;
	vector<int> v;
	for(int x=max(a[n]-n+1,1);x<a[n];x++){
		int cnt1=n,res=1;
		bool flag=1;
		for(int i=n;i>=1;i--){
			if(a[i]<=x) res=(res*i)%m;
			else if(a[i]>=x+i){
				flag=0;}
			else{
				res=(res*(x+i-a[i]))%m;
			}
		}
		if(!flag) continue;
		if(res%m!=0) cnt++,v.push_back(x);
	}
	cout<<cnt<<endl;
	for(int i=0;i<v.size();i++) cout<<v[i]<<" \n"[i==v.size()-1];
    return 0;
}

猜你喜欢

转载自blog.csdn.net/kosf_/article/details/107198461