題面
題解窩本來想用這道題寫矩陣雜湊的,所謂矩陣雜湊,就是快速判斷兩個矩陣的乘積是不是另外乙個矩陣。
矩陣雜湊就是隨機乙個向量,利用矩陣結合律先算向量和各矩陣的乘積,然後直接比較兩個向量是不是相等的。
這樣本來是$n^3$的,就變成$n^2$的。
但是看到題解第一種方法更簡便而且更易懂,就寫第一種方法了。
所謂內積,就是點乘。
首先是二維的情況,假設檢查到$i$個,我們檢查$i$和$1..i-1$的字首和的內積是否為$(i-1)\% 2$,如果不是,一定說明$i$和前面的某個$x$的內積是2的倍數,遍歷$1~i-1$檢查一遍。否則,不知道有沒有,就不檢查了。
三維的情況不能直接套用,因為如果內積不是$3$的倍數,不知道具體是餘$1$還是餘$2$,但是我們知道,不管是$1$還是$2$,他們的平方都是餘$1$的(記得當年在奧數班,南小大聚聚$xjt$講的結論),所以我們考慮求的形式$$(a_1b_1+a_2b_2+...+a_kb_k)^2=a_1b_1\times(a_1b_1+....+a_kb_k)+....+a_kb_k\times(a_1b_1+....+a_kb_k)$$,所以拆成$k^2$維的向量(或者說,拆成$k\times k$的「矩陣」)
然後很寒摻,只有$85$分,最後$3$個點$t$了,我也不知道怎麼回事啊。
#include#include#include
#include
#define ri register int
#define n 100050
#define d 105
using
namespace
std;
intn,d,k;
intv[n][d];
intb[d],c[d][d];
intid[n];
inline
intread()
inline
int work(int
cur)
else
return ret%k;
}inline
bool check(int
cur)
} return0;
}int
main()
} puts(
"-1 -1");
return0;
}
NOI2013 向量內積
定義兩個 d 維向量 的內積為其相對應維度的權值的乘積和 a i b i 現在有 n 個 d 維向量,判斷是否存在兩個向量的內積為 k 的倍數 我們考慮將 n 個 d 維的向量構成乙個 n d 的矩陣 a a 為 a 的轉置矩陣。令矩陣 那麼 就表示了向量 i 與向量 j 的內積。直接判斷內積的值即...
矩陣乘法 NOI2013 向量內積
兩個 d 維向量 a a1,a2,ad 與 b b1,b 2,bd 的內積為其相對應維度的權值的乘積和,即 a b i 1 daib i a1 b1 a 2b2 ad bd現在有 n 個 d維向量 x1 x2,xn 小喵喵想知道是否存在兩個向量的內積為 k 的倍數。請幫助她解決這個問題。第一行包含 ...
NOI2013 向量內積(隨機好題)
先考慮 k 2 怎麼做。注意到點積不為0就為1。我們隨機乙個排列 p i 然後列舉 i 1 n 看看 p i 與 p 1.i 1 的點積和 s 如果 s i 1 mod k 則說明 p 1.i 1 中一定有乙個向量和 p i 的點積 0 此時暴力check就行了。最壞情況一次check的錯誤概率是 ...