首页 > 其他 > 详细

SD 一轮集训 day4 弦形袋鼠

时间:2018-06-13 10:38:10      阅读:167      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

     可以发现把每一个 a[i] * b[i] 加到矩阵里去,就相当于 把一个 1*m 的向量伸缩后变成 n个再加到矩阵里去,所以答案就是远=原矩阵中线性线性无关组的个数。

 (而且好像一个矩阵横着消元和竖着消元 ,得到的线性无关组个数是一样的啊)

 

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int ha=1e9+7,maxn=205;
inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x;}
inline void ADD(int &x,int y){ x+=y; if(x>=ha) x-=ha;}

inline int ksm(int x,int y){
	int an=1;
	for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha;
	return an;
}

int a[maxn][maxn],n,m;

inline int solve(){
	int i=1,j=1,pos;
	while(i<=n&&j<=m){
		pos=0;
		for(int k=i;k<=n;k++) if(a[k][j]){ pos=k; break;}
		
		if(!pos){ j++; continue;}
		
		if(pos!=i) for(int k=j;k<=m;k++) swap(a[pos][k],a[i][k]);
		
		
		int inv=ksm(a[i][j],ha-2),tmp;
		for(int k=i+1;k<=n;k++) if(a[k][j]){
			tmp=inv*(ll)a[k][j]%ha;
			for(int l=j;l<=m;l++) ADD(a[k][l],ha-a[i][l]*(ll)tmp%ha);
		}
		
		i++,j++;
	}
	
	return i-1;
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=m;j++) scanf("%d",&a[i][j]),ADD(a[i][j],ha);
	
	printf("%d\n",solve());
	return 0;
}

  

SD 一轮集训 day4 弦形袋鼠

原文:https://www.cnblogs.com/JYYHH/p/9176033.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!