Problem A 时之终结
构造一个含有$n$个节点的无重边无自环的有向图,
使得从$1$出发,每一次经过一条$(u,v) (u < v)$的边到达节点$n$的方案恰好有$y$种。
对于$100\%$的数据,输出的无向图顶点树$n \leq 64 $给出的$y \leq 10^{18}$
Sol : 首先构造$63$个点的完全图,然后向第64个顶点连边,原问题等价于将$y$二进制拆分。
这样构造可以获得满分:复杂度$O( {log_2}^2 n)$
# include <bits/stdc++.h> # define int long long using namespace std; bool mp[65][65]; signed main() { int y; scanf("%lld",&y); int cnt=0; for (int i=1;i<=63;i++) for (int j=i+1;j<=63;j++) mp[i][j]=1,cnt++; for (int i=0;i<=63;i++) if ((y>>i)&1ll) mp[i+2][64]=1,cnt++; printf("64 %lld\n",cnt); for (int i=1;i<=64;i++) for (int j=i+1;j<=64;j++) if (mp[i][j]) printf("%lld %lld \n",i,j); return 0; }