感觉复杂度没问题,为啥会 T。
#include<cstdio>
using namespace std;
int n,m,k,ans,add;
int a[20],reans[1000010][20],p[1000010];
bool tong[1000010];
bool check() {
for(int i=n+1;i<=n*2;i++) a[i]=a[i-n];
for(int i=1;i<=2*n;i++) p[i]=p[i-1]+a[i];
for(int i=1;i<=p[2*n];i++) tong[i]=false;
for(int i=1;i<=n;i++)
for(int j=i;j<=i+n-1;j++) tong[p[j]-p[i-1]]=true;
int i=m;
while(tong[i]) i++;
i--;
if(i>ans) { add=0; ans=i; return true;}
return i==ans;
}
int main() {
scanf("%d %d %d",&n,&m,&k);
if(n==5) {
for(a[1]=k;a[1]<=m;a[1]++)
for(a[2]=a[1];a[2]<=k+15;a[2]++)
for(a[3]=a[1];a[3]<=k+15;a[3]++)
for(a[4]=a[1];a[4]<=k+15;a[4]++)
for(a[5]=a[1];a[5]<=k+15;a[5]++)
if(check()) {
add++;
for(int i=1;i<=5;i++) reans[add][i]=a[i];
}
}
else {
for(a[1]=k;a[1]<=m;a[1]++)
for(a[2]=a[1];a[2]<=k+15;a[2]++)
for(a[3]=a[1];a[3]<=k+15;a[3]++)
for(a[4]=a[1];a[4]<=k+15;a[4]++)
for(a[5]=a[1];a[5]<=k+15;a[5]++)
for(a[6]=a[1];a[6]<=k+15;a[6]++)
if(check()) {
add++;
for(int i=1;i<=6;i++) reans[add][i]=a[i];
}
}
printf("%d\n",ans);
for(int i=1;i<=add;i++) {
for(int j=1;j<=n;j++) printf("%d ",reans[i][j]);
puts("");
}
return 0;
}