题意描述
这一题的意思其实就是,让你构造一个\(n * k\)的矩阵,使得第 i 列的总和为 i ,同时使得:每一列的任意两个数之间的差不大于1,且任意两行之间的总和差不大于1。
\(1 \le n * k \le 10^6\)
观察样例:
输入:
5 5
输出:
0 0 1 1 1
0 0 1 1 1
1 0 1 0 1
0 1 0 1 1
0 1 0 1 1
可以发现一个规律,可能这样不太好看出来,但是如果是这样就很清楚了。
1 0 1 0 1
0 1 0 1 1
0 1 0 1 1
0 0 1 1 1
0 0 1 1 1
1...1...
1...
1...
1 ...
1 ...
也就是每一列,从当前位置从上往下循环加一,当达到这一列的总数时,跳到下一列,而下一列的起始位置就是上一列加一。
但是,如果我们直接暴力模拟加的过程,肯定是会超时的,因为这样的时间复杂度是总共的个数\(\frac{n (n + 1)}{2}\),也就是\(O(n^2)\)的,这样显然会超时。
我们想对于第 i 列,循环去加,实际上每个数是加了\(\lfloor \frac{i}{k} \rfloor\)循环次,剩下不能凑成整循环的\(i \mod k\)个,再加上 1 ,这样每个数的结果就可以直接算出,不需要模拟去加了。
时间复杂度\(O(n·k)\)
标签:...,题解,复杂度,牛客,循环,64,一列 From: https://www.cnblogs.com/six-one/p/17018253.html