题解 菜肴挑选
奇诡无意义构造题
直接放题解因为这个思路根本不可想
点击查看代码
// ubsan: undefined
// accoders
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 100010
#define pb push_back
#define ll long long
//#define int long long
char buf[1<<21], *p1=buf, *p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
inline int read() {
int ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
}
int n;
vector<tuple<int, int, int>> sta;
signed main()
{
freopen("dish.in", "r", stdin);
freopen("dish.out", "w", stdout);
n=read();
if (n&1) {
printf("%d\n", n*(n-1)/2);
for (int i=0; i<n; ++i)
for (int j=1; j<=n/2; ++j)
printf("%d %d %d\n", i+1, (i-j+n)%n+1, (i+j)%n+1);
}
else {
int m=n-1;
for (int i=0; i<m; ++i)
for (int j=1; j<=m/2; ++j)
sta.pb({i+1, (i-j+m)%m+1, (i+j)%m+1});
for (int i=0; i<m; ++i) sta.pb({i+1, (i+1)%m+1, n});
for (int i=0; i<m; ++i) sta.pb({i+1, (i+1)%m+1, n});
for (int i=0; i<m; ++i) sta.pb({i+1, (i+2)%m+1, n});
for (int i=0; i<m; ++i)
for (int j=2; j<=m/2; ++j)
sta.pb({i+1, (i-j+m)%m+1, (i+j)%m+1});
printf("%lu\n", sta.size());
for (auto& it:sta) printf("%d %d %d\n", get<0>(it), get<1>(it), get<2>(it));
}
return 0;
}