題意:
有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,恰好某...