兩個d 維向量a=[a1,a2,...,ad]與b=[b1,b2,...,bd]的內積為其相對應維度的權值的乘積和,即:
現有 n 個d 維向量x1,...,xn ,小喵喵想知道是否存在兩個向量的內積為k的倍數。請幫助她解決這個問題
首先做乙個轉換:如果把 \(b=a*a^t\) 構造出來,那麼 \(b[i][j]\) 就代表向量 \(i\) 和向量 \(j\) 的內積,如果為 \(\mod k=0\) 則滿足要求
\(a^t\) 是轉置矩陣,也就是把原矩陣交換行列之後的矩陣
如果 \(k=2\)
我們只需要判斷 \(a*a^t\) 是否和全 \(1\) 矩陣相等就行了
判斷兩個大矩陣相等一般用隨機法:
隨機乙個行向量 \(e\),然後分別乘以兩個矩陣判斷行向量最後是否相等
行向量乘以矩陣的複雜度是 \(o(n*d)\) 的,所以複雜度就對了,在這個題利用矩乘的分配率 \(e*(a*a^t)=(e*a*)a^t\)
這樣一次隨機的正確性是 \(0.5\) 的(不會證),多隨幾次就可以了
\(k=3\)時
由於矩陣中還有可能出現 \(2\) ,我們發現乙個性質 \(2^2\mod 3=1\)
所以我們只需要把內積平方一下就可以了,即:
\((\sum_^a_i*b_i)*(\sum_^a_i*b_i)=\sum_^\sum_^a_i*b_i*a_j*b_j\)
相當於是構造出了乙個大小為 \(n*d^2\) 的矩陣,還是像 \(k=2\) 那樣做就可以了
#includeusing namespace std;
const int n=100010,m=110;
int a[n][m],n,m,mod,a[n],b[n],x[n],id[m][m];
inline void check(int x)
}inline void solve()
inline void solvet()
int main()
bzoj 3240 Noi2013 矩陣遊戲
有乙個巨大的n行m列的矩陣。這個矩陣滿足乙個神奇的性質 若用f i j 來表示矩陣中第i行第j列的元素,則f i j 滿足下面的遞推式 f 1 1 1 f i,j a f i j 1 b j 1 f i,1 c f i 1 m d i 1 遞推式中a,b,c,d都是給定的常數。現在問你f n m 的...
BZOJ3240 Noi2013 矩陣遊戲
婷婷是個喜歡矩陣的小朋友,有一天她想用電腦生成乙個巨大的n行m列的矩陣 你不用擔心她如何儲存 她生成的這個矩陣滿足乙個神奇的性質 若用f i j 來表示矩陣中第i行第j列的元素,則f i j 滿足下面的遞推式 f 1 1 1 f i,j a f i j 1 b j 1 f i,1 c f i 1 m...
BZOJ 3240 Noi2013 矩陣遊戲
給出 n,m 1 le n,m le 10 求 f n,m mod 10 9 7 begin f 1,1 1 f i,1 cf i 1,m d f i,j af i,j 1 b j neq 1 end 其中 1 le a,b,c,d le 10 9 對於遞推式 f i af b 當 a 1 時通項為...