zoukankan      html  css  js  c++  java
  • [codeforces gym Matrix God]随机矩阵乘法

    题目链接:http://codeforces.com/gym/101341/problem/I

    随机真是一个神奇的方法。原本矩阵乘法是n^3的复杂度,但是这个题是让判断两个矩阵是否相等,只需要在两个矩阵分别左乘一个1*n的矩阵,右乘一个n*1的矩阵,这样两个矩阵就被压缩成了一个数,类似于特征值。只需判断这两个数是否相等即可。

    那么如何生成这两个矩阵呢?随机数。如果怕不保险可以多随机几次,有一次不相等就算不相等,每次都相等就算相等。

    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn=1005;
    const int md=1000000007;
    int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];
    int r1[maxn],r2[maxn];
    int res1[maxn],res2[maxn],resL,resR;
    
    int main()
    {
        srand(unsigned(time(NULL)));
        int n;
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                scanf("%d",&a[i][j]);
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                scanf("%d",&b[i][j]);
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                scanf("%d",&c[i][j]);
        bool flag=true;
        for (int z=1;z<=5;z++)
        {
            for (int i=1;i<=n;i++) r1[i]=rand();  //1*n
            for (int i=1;i<=n;i++) r2[i]=rand();  //n*1
            for (int i=1;i<=n;i++) res1[i]=res2[i]=0;
            resL=resR=0;
            for (int i=1;i<=n;i++) //r1*a and b*r2
            {
                for (int j=1;j<=n;j++)
                {
                    res1[i]=(res1[i]+1ll*r1[j]*a[j][i]%md)%md;
                    res2[i]=(res2[i]+1ll*r2[j]*b[i][j]%md)%md;
                }
            }
            for (int i=1;i<=n;i++) resL=(resL+1ll*res1[i]*res2[i]%md)%md;
            for (int i=1;i<=n;i++) res1[i]=res2[i]=0;
            for (int i=1;i<=n;i++) //r1*c
            {
                for (int j=1;j<=n;j++)
                {
                    res1[i]=(res1[i]+1ll*r1[j]*c[j][i]%md)%md;
                }
            }
            for (int i=1;i<=n;i++) resR=(resR+1ll*res1[i]*r2[i]%md)%md;
            if (resL!=resR)
            {
                flag=false;
                break;
            }
        }
        if (flag) printf("YES
    ");
        else printf("NO
    ");
        return 0;
    }
  • 相关阅读:
    OC面向对象—封装
    OC面向对象—继承
    hdu 4612 Warm up(缩点+树上最长链)
    hdu 4604 Deque(最长不下降子序列)
    hdu 4607 Park Visit(树上最长链)
    hdu 4609 3-idiots(快速傅里叶FFT)
    codeforces 333B
    codeforces 333A
    codeforces 334B
    codeforces 334A
  • 原文地址:https://www.cnblogs.com/acmsong/p/7196460.html
Copyright © 2011-2022 走看看