构造一个有向简单图,使得从1号点走m步到n号点的方案数恰好为K。
K<=1e18, n,m<=30
取 C=9 D=20
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long ll;
const int N=35;
int n,m,C,D;
int a[N][N];
int main(){
int T; ll K;
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
scanf("%d",&T);
while (T--){
scanf("%lld",&K); cl(a);
n=30,m=21; C=9,D=20;
for (int i=2;i<=C+1;i++)
a[1][i]=1;
for (int i=2;i<=C+1;i++)
for (int j=2;j<=C+1;j++)
a[i][j]=1;
for (int i=1;i<D;i++)
a[1+C+i][1+C+i+1]=1;
for (int i=0;i<=19;i++){
for (int j=1;j<=K%C;j++)
a[1+j][1+C+i+1]=1;
K/=C;
}
printf("%d %d\n",n,m);
for (int i=1;i<=n;i++,printf("\n"))
for (int j=1;j<=n;j++)
printf("%d",a[i][j]);
}
return 0;
}