zoukankan      html  css  js  c++  java
  • poj3318

    题意:给定三个矩阵a,b,c,问a×b是否等于c?

    分析:只需要设置一个列向量x,求a*(b*x),求c*x,看是否相等即可。

    当然这不能保证正确,x是生成的随机向量,多次生成多次测试即可使错误概率大大减小。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <ctime>
    #include <algorithm>
    using namespace std;
    
    const int maxn = 510;
    
    long long  a[maxn][maxn], b[maxn][maxn], c[maxn][maxn], x[maxn];
    int n;
    
    void init(long long m[maxn][maxn])
    {
    	for (int i = 0; i < n; i++)
    		for (int j = 0; j < n; j++)
    			scanf("%I64d", &m[i][j]);
    }
    
    void mul(long long m[maxn][maxn], long long x[maxn], long long ans[maxn])
    {
    	for (int i = 0; i < n; i++)
    	{
    		ans[i] = 0;
    		for (int j = 0; j < n; j++)
    			ans[i] += x[j] * m[i][j];
    	}
    }
    
    bool check(long long ans1[maxn], long long ans2[maxn])
    {
    	for (int i = 0; i < n; i++)
    		if (ans1[i] != ans2[i])
    			return false;
    	return true;
    }
    int main()
    {
    	//freopen("D:\\t.txt", "r", stdin);
    	scanf("%d", &n);
    	init(a);
    	init(b);
    	init(c);
    	int t = 10;
    	while (t--)
    	{
    		srand(time(NULL));
    		for (int i = 0; i < n; i++)
    			x[i] = rand()%1000 + 1;
    		long long ans[maxn], ans1[maxn], ans2[maxn];
    		mul(b, x, ans);
    		mul(a, ans, ans1);
    		mul(c, x, ans2);
    		if (!check(ans1, ans2))
    		{
    			printf("NO\n");
    			return 0;
    		}
    	}
    	printf("YES\n");
    	return 0;
    }
    
    
  • 相关阅读:
    MIne FirstBlog
    P6563 [SBCOI2020]一直在你身旁
    P6563 [SBCOI2020]一直在你身旁
    T122085 [SBCOI2020]时光的流逝
    LC 918. Maximum Sum Circular Subarray
    1026 Table Tennis
    LC 1442. Count Triplets That Can Form Two Arrays of Equal XOR
    LC 1316. Distinct Echo Substrings
    LC 493. Reverse Pairs
    1029 Median (二分)
  • 原文地址:https://www.cnblogs.com/rainydays/p/1948629.html
Copyright © 2011-2022 走看看