bzoj 2396 神奇的矩陣 隨機化

2021-09-01 23:47:46 字數 1338 閱讀 6714

題目大意:

給定三個n∗n

n*nn∗

n的矩陣a

aa,b

bb,c

cc,判斷是否a∗b

=c

a*b=c

a∗b=c。

其中n

≤1000

n≤1000

n≤1000

。分析:

我們隨機乙個n∗1

n*1n∗

1的矩陣r

rr,對於滿足上述式子的乙個答案,必然有a∗b

∗r=c

∗r

a*b*r=c*r

a∗b∗r=

c∗r。

而a ∗b

∗r=a

∗(b∗

r)

a*b*r=a*(b*r)

a∗b∗r=

a∗(b

∗r),都可以在o(n

2)

o(n^2)

o(n2

)做出。

**:

#include #include #include #include #include #define ll long long

const int maxn=1001;

using namespace std;

int n;

int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];

int rad[maxn],ans1[maxn],ans2[maxn],tmp[maxn];

bool check()

for (int i=1;i<=n;i++) ans2[i]=tmp[i];

for (int i=1;i<=n;i++)

for (int i=1;i<=n;i++) ans1[i]=tmp[i];

for (int i=1;i<=n;i++)

for (int i=1;i<=n;i++) ans1[i]=tmp[i];

int flag=1;

for (int i=1;i<=n;i++) if (ans1[i]!=ans2[i]) return 0;

return 1;

}void solve()

for (int i=1;i<=n;i++)

for (int i=1;i<=n;i++)

int flag=1;

for (int i=1;i<=20;i++) flag&=check();

if (flag) printf("yes\n");

else printf("no\n");

}int main()

BZOJ 2396 神奇的矩陣 矩陣 隨機

其實不要放過題目給出的每乙個資訊,就像這一道題,思考為什麼一定是矩陣,為什麼不是乙個簡單的數列之內的,說明解決這一道題就很用到矩陣的特殊性質。其中矩陣有乙個性質就是a b c,c的行數等於a的行數,c的列數等於b的列數,所以我們完全可以隨機構造乙個n行1列的舉證,然後利用矩陣乘法的結合律把矩陣變成n...

bzoj2396 神奇的矩陣

description 給出三個行數和列數均為n的矩陣a b c,判斷a b c是否成立。input 題目可能包含若干組資料。對於每組資料,第一行乙個數n,接下來給出三個n n的矩陣,依次為a b c三個矩陣。output 對於每組資料,若a b c成立,則輸出yes,否則no。每個答案佔一行。sa...

bzoj2396 神奇的矩陣

與51nod1140一樣。不過這題是多組資料的。坑。include include include include includeusing namespace std define rep i,s,t for int i s i t i define dwn i,s,t for int i s i...