#include <cstdio> #include<cstdlib> int judge(int n) { if(n==1) return 0; while(n!=1&&n%2==0) n/=2; if(n==1) return 1; return 0; } void divide(int*a,int*a11,int*a12,int*a21,int*a22,int n) { for(int i=0;i<2*n;i++) for(int j=0;j<2*n;j++) if(i<n&&j<n) *(a11+i*n+j)=*(a+2*i*n+j); else if(i<n&&j>=n) *(a12+i*n+j-n)=*(a+2*i*n+j); else if(i>=n&&j<n) *(a12+(i-n)*n+j)=*(a+2*i*n+j); else *(a12+(i-n)*n+j-n)=*(a+2*i*n+j); } int *sub(int *a,int *b, int n) { int *res; res=(int*)malloc(sizeof(int)*n*n); for(int i=0;i<n;i++) for(int j=0;j<n;j++) *(res+i*n+j)=*(a+i*n+j)-*(b+i*n+j); return res; } int *plus(int *a,int *b, int n) { int *res; res=(int*)malloc(sizeof(int)*n*n); for(int i=0;i<n;i++) for(int j=0;j<n;j++) *(res+i*n+j)=*(a+i*n+j)+*(b+i*n+j); return res; } int *strassen(int *a,int *b,int n) { int *res; res=(int *)malloc(sizeof(int)*n*n); if(n==2) { int m1,m2,m3,m4,m5,m6,m7; m1=*a*(*b-*b+1); m2=(*a+*(a+1))*(*(b+3)); m3=*b*(*(a+2)+*(a+3)); m4=*(a+3)*(*(b+2)-*b); m5=(*a+*(a+3))*(*(b+3)+*b); m6=(*(a+1)-*(a+3))*(*(b+2)+*b); m7=(*a-*(a+3))*(*(b+1)+*b); *res=m5+m4+m6-m2; *(res+1)=m1+m2; *(res+2)=m3+m4; *(res+3)=m5+m1-m3-m7; return res; } int *a11,*a12,*a21,*a22; int *b11,*b12,*b21,*b22; int *s1,*s2,*s3,*s4,*s5,*s6,*s7; int *c11,*c12,*c21,*c22; a11=(int *)malloc(sizeof(int)*n*n/4); a12=(int *)malloc(sizeof(int)*n*n/4); a21=(int *)malloc(sizeof(int)*n*n/4); a22=(int *)malloc(sizeof(int)*n*n/4); b11=(int *)malloc(sizeof(int)*n*n/4); b12=(int *)malloc(sizeof(int)*n*n/4); b21=(int *)malloc(sizeof(int)*n*n/4); b22=(int *)malloc(sizeof(int)*n*n/4); /* s1=(int *)malloc(sizeof(int)*n*n/4); s2=(int *)malloc(sizeof(int)*n*n/4); s3=(int *)malloc(sizeof(int)*n*n/4); s4=(int *)malloc(sizeof(int)*n*n/4); s5=(int *)malloc(sizeof(int)*n*n/4); s6=(int *)malloc(sizeof(int)*n*n/4); s7=(int *)malloc(sizeof(int)*n*n/4); */ divide(a,a11,a12,a21,a22,n/2); divide(b,b11,b12,b21,b22,n/2); s1=strassen(a11,sub(b12,b22,n/2),n/2); s2=strassen(plus(a11,a12,n/2),b22,n/2); s3=strassen(plus(a21,a22,n/2),b11,n/2); s4=strassen(a22,sub(b21,b11,n/2),n/2); s5=strassen(plus(a11,a22,n/2),plus(b11,b22,n/2),n/2); s6=strassen(sub(a12,a22,n/2),plus(b21,b22,n/2),n/2); s7=strassen(sub(a11,a21,n/2),plus(b11,b12,n/2),n/2); c11=plus(sub(plus(s5,s4,n/2),s2,n/2),s6,n/2); c12=plus(s1,s2,n/2); c21=plus(s3,s4,n/2); c22=sub(sub(plus(s5,s1,n/2),s3,n/2),s7,n/2); res=(int *)malloc(sizeof(int)*n*n); for(int i=0;i<n/2;i++) for(int j=0;j<n/2;j++) { *(res+i*n+j)=*(c11+i*n/2+j); *(res+i*n+j+n)=*(c12+i*n/2+j); *(res+i*n+j+n*n/2)=*(c21+i*n/2+j); *(res+i*n+j+n*n/2+n)=*(c22+i*n/2+j); } return res; } int main() { int* a,*b,*res; int n; scanf("%d",&n); if(!judge(n)) return 0; FILE* fp; if((fp=fopen("test.txt","r"))==NULL) return 0; a=(int*)malloc(sizeof(int)*n*n); b=(int*)malloc(sizeof(int)*n*n); for(int i=0;i<n;i++) for(int j=0;j<n;j++) fscanf(fp,"%d",a+i*n+j); for(i=0;i<n;i++) for(int j=0;j<n;j++) fscanf(fp,"%d",b+i*n+j); fclose(fp); printf("/n/n/n"); for(i=0;i<n;i++) { for(int j=0;j<n;j++) printf("%d ",*(a+i*n+j)); printf("/n"); } printf("/n/n/n"); for(i=0;i<n;i++) { for(int j=0;j<n;j++) printf("%d ",*(b+i*n+j)); printf("/n"); } printf("/n/n/n"); res=strassen(a,b,n); for(i=0;i<n;i++) { for(int j=0;j<n;j++) printf("%d ",*(res+i*n+j)); printf("/n"); } return 0; }