HDU 6313 2018多校第二場hack it

2021-08-21 18:54:42 字數 1112 閱讀 1563

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...