poj3213

来源:互联网 发布:淘宝打假2016多久结束 编辑:程序博客网 时间:2024/05/21 19:42

    传送门 http://poj.org/problem?id=3213

    题目大意:两个矩阵(N<=1000)相乘,只有一个地方可能出错,问是否有错,并修改。

    矩阵乘法最低复杂度就是N^3的啊,要计算每一个的话,妥妥超时,但这题规定,只有可能一个地方出错,可以通过求出前一个矩阵的列和,后一个矩阵的行和,进行简化,十分巧妙。

      

#include <map>#include <set>#include <stack>#include <queue>#include <cmath>#include <string>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <sstream>#include <cstdlib>#include <iostream>#include <algorithm>#include <iomanip>#pragma comment(linker,"/STACK:102400000,102400000")using namespace std;#define   MAX           1005#define   MAXN          100005#define   maxnode       105#define   sigma_size    2#define   lson          l,m,rt<<1#define   rson          m+1,r,rt<<1|1#define   lrt           rt<<1#define   rrt           rt<<1|1#define   middle        int m=(r+l)>>1#define   LL            long long#define   ull           unsigned long long#define   mem(x,v)      memset(x,v,sizeof(x))#define   lowbit(x)     (x&-x)#define   pii           pair<int,int>#define   bits(a)       __builtin_popcount(a)#define   mk            make_pair#define   limit         10000const ull    prime = 999983;const int    INF   = 0x3f3f3f3f;//const LL     INFF  = 0x3f3f3f3f;const double pi    = acos(-1.0);const double inf   = 1e18;const double eps   = 1e-9;const LL     mod   = 1e9+7;const ull    mxx   = 1333331;/*****************************************************/inline void RI(int &x) {      char c;      while((c=getchar())<'0' || c>'9');      x=c-'0';      while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0';}/*****************************************************/int n,m,p,k;int a[1010][1010],b[1010][1010],c[1010][1010];LL suma[1010],sumb[1010],sumc1[1010],sumc2[1010];int main(){    while(cin>>n>>m>>k){        mem(suma,0);        mem(sumb,0);        mem(sumc1,0);        mem(sumc2,0);        for(int i=0;i<n;i++){            for(int j=0;j<m;j++){                scanf("%d",&a[i][j]);                suma[j]+=a[i][j];            }        }        for(int i=0;i<m;i++){            for(int j=0;j<k;j++){                scanf("%d",&b[i][j]);                sumb[i]+=b[i][j];            }        }        for(int i=0;i<n;i++){            for(int j=0;j<k;j++){                scanf("%d",&c[i][j]);                sumc1[i]+=c[i][j];                sumc2[j]+=c[i][j];            }        }        bool bool1=true;        int ans1=0,ans2=0;        for(int i=0;i<n;i++){            LL temp=0;            for(int j=0;j<m;j++){                temp+=((LL)a[i][j]*sumb[j]);            }            if(temp!=sumc1[i]){                ans1=i;                bool1=false;                break;            }        }        for(int i=0;i<k;i++){            LL temp=0;            for(int j=0;j<m;j++){                temp+=((LL)b[j][i]*suma[j]);            }            if(temp!=sumc2[i]){                ans2=i;                break;            }        }        if(bool1){            cout<<"Yes"<<endl;        }        else {            cout<<"No"<<endl;            cout<<ans1+1<<' '<<ans2+1<<endl;            LL ans=0;            for(int i=0;i<m;i++){                ans+=(LL)a[ans1][i]*b[i][ans2];            }            cout<<ans<<endl;        }    }    return 0;}


    

0 0
原创粉丝点击