yukicoder #690 : E869120 and Constructing Array 4

N=32とする。1<=v<w<=31としてを満たすすべての辺(v, w)の辺を貼ると1から2<=x<=31までの経路の和は2x-2通りである。これは経路数をf(x)と表すと f(x) = f(1) + f(2) +...+ f(x-2) + f(x-1) = (f(1)+f(2)+...+f(x-2)) + f(x-1) = f(x-1) + f(x-1) = 2f(x-1)であるため。よってKを2進数として各桁をみてk(>=0)ビット目が立っていたら頂点k+2から頂点Nに辺を張ればよい。

int K, N = 32;
cin >> K;
vector<pii> E;
for (int w = 2; w <= N - 1; w++)
    for (int v = 1; v < w; ++v)
        E.emplace_back(v, w);
rep(a, 30)if (K >> a & 1)E.emplace_back(a + 2, N);
cout << N << ' ' << sz(E) << endl;
each(e, E)cout << e.first << ' ' << e.second << endl;