10000 10000 10000 10000 10000
10000 01000 00100 00010 00001
10000 00100 00001 01000 00010
10000 00010 01000 00001 00100
10000 00001 00010 00100 01000
01000 01000
01000 00100
dls:類似的構造遇到過幾次了,orz,聽了dls的構造方法,對於乙個塊,行數為p(質數),列數為p*p,列又分為p段,每段p個,然後對於整個大正方形矩陣,就有n/p個這樣的塊,第乙個塊的的一段都是1開始,第二個塊的第一段都是2開始...然後同乙個塊中,每一段的每一行的位置都是上一段同一行的位置+段的編號再%p。
就這樣乙個構造法,最後取前2000*2000的矩陣,最後我寫check發現是85105個1。
我們可以發現,對於每乙個塊,除了第一段是1在一條線上的,其他每段都是乙個沒有1在一條線上的p的排列。
對於每一塊的同一段從上往下看1的排列,其實一共有a(p,p)種,就是p!種,遠遠大於總共的p塊*(p-1)段,其實每一塊的每一塊p*每一段(p-1)只要去這些排列中不同的就行了,但是使用dls的構造方法就可以開心地得到上述結果。(好像直接dfs出p*p個矩陣也星)由於p要是質數,43*43<2000,那麼我們就去47*47了,然後在輸出前2000*2000的矩陣。注意乙個問題是printf數字要比printf乙個char陣列慢太多了。。。4*1e6的printf要6s多。。。scanf是不是也這麼慢的。。。
------update:好像直接dfs出p*p個p排列的矩陣隨意放置是不行的,需要特殊的放置技巧,來放置這些p排列的矩陣,不過好像沒撒好的想法,還是dls這個構造方法強
#include#include#include#define maxl 3010
using namespace std;
char a[maxl][maxl];
int main()
for(int i=0;i<2000;i++)
puts("2000");
for(int i=0;i<2000;i++)
return 0;
}
HDU 多校聯合第二場
不是在為這次比賽找藉口。我真的想吐嘈一下這道題。尼嘛!明明是狀態dp!非得搞得資料隨便貪心都能過!過你妹啊!埋頭想dp的時候,大約開始十幾分鐘,重新整理了一下。我了個去!快上百了!純屬噁心人嗎?吐嘈完畢 狀態dp 1 n 20,最多20位,完全可以位壓縮。預處理一下hp sum i i 010111...
hdu多校題解
給定 n 求 sum limits sum mu d frac sum frac 再令 h n sum frac 則有 g n frac sum mu d frac h frac 推導 f 和 g 的關係 f n f sum limits frac sum limits g n g f n f 2 ...
多校第二場 E MAZE
首先,這題的列數非常的小,很像矩陣快速冪加速dp。這題實際上也是維護了一段區間矩陣乘積的結果。查詢 o 1 修改 o logn k 3 這裡有乙個需要注意的點是左乘和右乘的區別。矩陣快速冪還是 1,n n,n 這種形式比較好。include define lc l,mid,x 1 define rc...