rt,随便写了如下程序:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<deque>
#include<map>
#include<random>
#include<unordered_map>
using namespace std;
namespace code{
using ll=long long;
using ull=unsigned long long;
using uint=unsigned int;
#define F(i,x,y) for(int i=(x),__tt2__=(y);i<=__tt2__;i++)
#define R(i,x,y) for(int i=(x),__tt2__=(y);i>=__tt2__;i--)
#define _F(i,x,y) for(int i=(x),__tt2__=(y);i<__tt2__;i++)
#define _R(i,x,y) for(int i=(x),__tt2__=(y);i>__tt2__;i--)
#define debug(x) cerr<<#x<<'='<<(x)<<endl
map<int,int> a;
vector<int>tmp;
int main(){
int T,n,m,v,tot=0;
cin>>T>>n>>m>>v;
mt19937 rng((time(0)^T)*n/m+v);
F(i,1,100){
F(j,1,T){
a.clear();
tmp.clear();
bool check=0;
F(i,1,m){
int c=rng()%n+1,d=rng()%v+1;
if(a[c]==0)a[c]=d;
else if((a[c]!=d)){
if((i!=m)&&(j!=T))tot++;
check=1;
break;
}
tmp.push_back(c);
}
debug(tmp.size());
if(check)break;
}
}
debug(tot);
return 0;
}
}
signed main(){return code::main();}
它会输入 T,n,m,v,造一百组数据,输出第多少个 ci 时判出无解(有解则输出 m)以及总计有多少组数据出现了“无解不在最后一次循环”的情况。
然后我把 17∼20 号点的数据分别输进去了 5 次,得到的无一例外是 100 组,也就是说,在随机数据下,极大概率出现无解且不是最后一次循环判出的情况,本题极弱的大样例疑似刻意构造。