フェイス質問
https://www.luogu.org/problem/P1224
問題の解決策
ウォータールーは、問題を解決するためのハッシュを持つ行列を書きたいと思っていた、いわゆる行列のハッシュはすぐに二つの行列の積は別の行列ではありません決定されます。
ハッシュ行列は、各行列の最初のオペレータ連想の行列ベクトル積によってランダムベクトルであり、直接比較する2つのベクターは、等しくありません。
これは^ 3 $ $ nを持っているだろう、^ 2 $の$ n個になります。
しかし、第1の方法は、より便利かつ理解しやすいという問題の解決策を表示するには、最初の方法を書きました。
いわゆる内積は内積です。
最初は、2次元の場合で、$ iはチェックを$と仮定して、我々は、製品内および$(I-1)\%2 $、そうでない場合はどうか$ I $と$ 1..i-1 $接頭辞を確認します特定の製品の指示と$ I $ $ X $の上記は、再び〜I-1の$チェック$ 1を通過、2の倍数です。そうでなければ、私が持っているかどうかは知りませんが、チェックされません。
$ 3 $倍、より内積以上$ 1 $の特別知っている以上より$ 2 $していない場合ので、三次元の場合は、直接、適用することはできませんが、我々はそれが$ 1 $または$ 2かどうか、ということを知っているその正方形である以上$ 1 $です$ (南一緒に取得$ xjt $大小話す結論を数学オリンピッククラスを覚えている)、私たちは(a_1b_1 + ... +(a_1b_1 + a_2b_2 + ... + a_kb_k)^ 2 = a_1b_1 \回$$の形で要求を考えますa_kb_k)+ ... + a_kb_k \回(a_1b_1 + ... + a_kb_k)$$、それが$ K ^ 2 $次元ベクトルに分割される(または、時間は "マトリックス" $ k個\ $ k個に分割しました)
すると非常に寒い、たったの$ 85 $ポイントと混合し、最後の$ 3 $ポイントの$ T $は、私がどのようにケースのああを知りません。
#include <cstdioを> する#include <iostreamの> する#include <アルゴリズム> の#include <CStringの> に#define RI登録INT の#define N 100050 の#define D 105 使用して 名前空間STD。 INTのN、D、K。 int型V [N] [D]。 INT B [D]、C [D] [D]。 INTのID [N]。 インラインint型リード(){ 登録チャー CH = GETCHAR()。RI RET = 0 。 一方、(CH < ' 0 ' || CH> ' 9 ')CH =getchar関数(); 一方、(CH> = ' 0 ' && CH <= ' 9 ')RET = RET * 10 +(CH- ' 0 ')、CH = GETCHAR()。 リターンRET; } インラインint型作業(INTのCUR){ RI RET = 0 。 もし(Kの== 2 ){ ため(RI i = 1 ; iが= Dを<; I ++の)RET + = B [I] * V [ID [CUR] [I]; 用(RI I = 1 B [I] + = V [ID [CUR] [I]、B [I] =%; iが= D <Iは++)2 ; } 他{ ため(RI i = 1 ; iは= D <; I ++の) のための(RIのJ = 1 ; J <= D; J ++)RET + = C [I] [J] * V [ID [CUR] [I] * V [ID [CUR] [J]。 用(RI i = 1 ; iが= D <; I ++の) ため(RIのJ = 1 ; J <= D; J ++)C [i]は[J] + = V [ID [CUR] [i]は* V [ ID [CUR] [J]、C [I] [J]%= 3 。 } 戻り RET%、K。 } インラインブールチェック(int型CUR){ ため(RI i = 1 ; iはCUR <; iは++ ){ RI RET = 0 。 用(RIのJ = 1 ; J <= D; J ++)RET + = V [ID [CUR] [J] * V [ID [I]、[J]。 もし(RET%でkは== 0 ){ int型のx = ID [i]は、Y = ID [CUR]。 もし(X> Y)スワップ(X、Y) printf(" %D%D \ n " 、x、y)は、 リターン 1 ; } } 戻り 0 。 } int型のmain(){ // のscanf( "%D%D%D"、&N、&D、およびK)。 N =読み取ります(); D =読み取ります(); K = リード()。 用(RI i = 1 ; I <= N; I ++ ) のための(RI J =1 ; J <= D; J ++)V [I] [J]読み取り=()%K。 用(RI i = 1 ; iが<= N; iが++)ID [I] = I。 int型 KS = 5 ; 一方、(ks-- ){ memsetの(B、0、はsizeof (b)参照)。 memset(C、0、はsizeof (c)参照)。 random_shuffle(ID + 1、ID + N + 1 )。 用(RI i = 1 ; iが<= N iが++ ){ int型、T = 仕事(I)。 もし(T!=(I- 1)%2)の場合(チェック(I))の戻り 0 ; } } プット(" -1 -1 " )。 リターン 0 ; }