SD 一轮集训 day4 弦形袋鼠

Posted jyyhh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SD 一轮集训 day4 弦形袋鼠相关的知识,希望对你有一定的参考价值。

技术分享图片

 

 

     可以发现把每一个 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
",solve());
	return 0;
}

  

以上是关于SD 一轮集训 day4 弦形袋鼠的主要内容,如果未能解决你的问题,请参考以下文章

SD 一轮集训 day1 lose

SD 一轮集训 day1 carcar

2017雅礼集训 Day4

北京集训DAY4

10.5 广州集训 Day4

CDQZ集训DAY4 日记