2013多校第四場 E題 ZZ的研究

2022-05-13 20:31:46 字數 2073 閱讀 4513

題意:

有n(n<=1000)個數 a1,a2,..,an,  ai <= 10^15, 取其中部分組合相乘的到數是乙個完全平方數.求方案總數.

其中保證 ai 不包含大於500的質因子.

解題思路:

解決本題需要有,線性代數基礎.  涉及到關於矩陣的初等變換與高斯消元.求解齊次方程.

首先考慮,乙個數 x = p1^e1 * p2^e2 * ... * pn^en

若其是乙個完全平方數,則  所有的 ei % 2 == 0 .

另外. 取部分數相乘. 例如三個數 ai*aj*ak = x ,此時我們只關心的是其

對應的質因子的冪皆為偶數. 所以對於 ai  =  p1^e1 * p2^e2 * ... * pk*ek 而言.

我們只需要知道對應的  ( e1, e2, e3, ... , ek )的奇偶性就可以了.

假定其 ei = 0, 則其為 偶數,  ei = 0, 則其為 奇數. 

則對於每乙個數字, 我們都可以用乙個 01向量表示, 因為題目已說明,不同質因子不會超過500. 

通過素數篩選500以內質數,發現其不超過88個.設其為m個, 所以我們得出, 對於每乙個數 ai ,我們都可以用乙個 88維的01列向量表示.

而對於 n 個數.  則有 n個 列向量來表示

| a11, a12, ...,a1n  |

| a21, a22, ...,a2n  |

| am1,am2,...,amn |

假設其為 a,   則有乙個n維列向量向量 x (x1,x2,..,xn),其中 xi 表示第i個數取還是不取,所以 xi = 0 or 1.

更直觀的反映是, 若 xi = 0,  則代表著第i個數不取, 意味著第對於矩陣a而言, 第j列的值與 n維列向量計算厚皆為0.

使其得到 乙個 m維列向量 b( b1,b2,...,bm ),形式如下

a*x = b .

其中 b ( b1,b2, ..., bm ) 即代表著 組合的數, res = p1^e1 * p2^e2 * ... * pm*em, 其 (e1, e2, .., em) 是否對應

位置是否為偶數,   例如 bi = 0, 則 ei 為偶數, bi = 1, ei 為奇數. 

若要保證 res 是乙個完全平方數,  則 b( b1, b2, ..., bm ) 必須為 b(0,0,...,0) 所以得到了乙個齊次方程組.

通過高斯消元.得出此矩陣的秩 r, 則此時秩的含義是, 有r個未知量xi能夠確定.

此時還有 n-r個未知量是不確定.  而 xi 的取值只有 0 or 1.  則此時解的方案數為  2^(n-r) ,

另外, 當 n-r個未知量都為空時, 不滿足題目要求. 所以需要減去1, 去掉空集的情況. 

view code

#include#include

#include

#include

#include

using

namespace

std;

const

int n = 1010

;typedef

intmatrix[n][n];

typedef

long

long

ll;int

pre[n],vis[n];

int getprime(int

x) }

return

cnt;}//

m個方程n個變數

int rank(matrix a, int m, int

n)

if( a[r][j] )

i++; //

處理下一行

} j++; //

處理下一列

}

returni;}

intmain()

} }

int r = rank( a, m+1

, n );

printf(

"%lld\n

", (1ll<

); }

return0;

}

2013第四場多校

多校第四場 6題,打得最好的一場多校。還是cjboy給力。本場比賽我基本上沒什麼貢獻,搞04一搞就是一下午。最後看了09覺得只有狀態壓縮,不知道怎麼優化。1004 圖論,強聯通分量 0 一開始推理的時候思路很清晰,但是接著就腦殘了,沒怎麼細想就直接去套樣例。以為得到了正確的解法,只是需要乙個特判。然...

2013多校第四場 B題

題意 兩個都含有n個元素的陣列a,b,求 a i b j i j n 的前 m個最小值 m n 解題思路 假定a,b陣列都有序,則我們有下面的結論 a 1 b 1 a 1 b 2 a 1 b n a 2 b 1 a 2 b 2 a 2 b n a n b 1 a n b 2 a n b n 那麼我們...

2015 多校第四場 XYZ and Drops

include include include include using namespace std struct node const int maxn 210 vector pair iterator it int d 5 2 int r,c 直接暴力模擬,注意題意 若水珠原來大小為3,恰好某...