题解:P13196 [GCJ 2016 #1C] Slides!
建议做本题之前先尝试求解方案数的题目食物链。
话说在校内出题组某位同学想出来了一道差不多的题,还多一个差分,然后那位同学给它评黄了……
题意:构造一个
对于这种构造,注意到可以不限边数,所以说,下面的这种方案得到的路径数肯定是最多的:

为什么呢?再加任意一条边,这个图上就会有环,即
那么容易发现此时
于是,得到结论:当
一个很精妙的观察:在这个图中,包含的子图
进一步可以得知:从这个图中,
考虑将
当然,假如
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N = 50 + 5;
int T, m, b, mp[N][N];
signed main() {
ios :: sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> T;
for(int i = 1; i <= T; i ++ ) {
cout << "Case #" << i << ": ";
memset(mp, 0, sizeof mp);
cin >> b >> m;
if(m > (1LL << (b - 2))) cout << "IMPOSSIBLE\n";
else {
cout << "POSSIBLE\n";
for(int i = 1; i < b; i ++ )
for(int j = i + 1; j < b; j ++ )
mp[i][j] = 1;
if(m == (1LL << (b - 2))) {
for(int i = 1; i < b; i ++ ) mp[i][b] = 1;
for(int i = 1; i <= b; i ++ ) {
for(int j = 1; j <= b; j ++ ) cout << mp[i][j];
cout << endl;
}
} else {
for(int i = 2; m > 0; m >>= 1, i ++ )
if(m & 1) mp[i][b] = 1;
for(int i = 1; i <= b; i ++ ) {
for(int j = 1; j <= b; j ++ ) cout << mp[i][j];
cout << endl;
}
}
}
}
return 0;
}