BZOJ4004: [JLOI2015]装备购买

时间:2023-03-09 16:10:11
BZOJ4004: [JLOI2015]装备购买

总之就是线性基那一套贪心理论直接做就好了。

然而加强数据后很卡精度的样子。

于是重点在于这个特技:在整数模意义下搞。

#include<cstdio>
#include<algorithm>
#define N 505
using std::sort;
int k,l,m,n,p=1e9+7;
int s[N],t[N];
int a[N][N],*v[N];
int pow(int u,int v){
	int a=1;
	for(;v;v>>=1){
		if(v&1)
			a=1ll*a*u%p;
		u=1ll*u*u%p;
	}
	return a;
}
bool ovo(int i,int j){
	return s[i]<s[j];
}
bool add(int k){
	for(int i=1;i<=m;++i){
		if(!a[k][i])continue;
		if(!v[i])
			return v[i]=a[k];
		else{
			long long u=p-pow(
			v[i][i],p-2)
			*1ll*a[k][i]%p;
			for(int j=m;j>=i;--j)
				a[k][j]=(a[k]
				[j]+u*v[i][j])%p;
		}
	}
	return 0;
}
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);
	for(int i=1;i<=n;++i)
		scanf("%d",s+i);
	for(int i=1;i<=n;++i)
		t[i]=i;
	sort(t+1,t+n+1,ovo);
	for(int i=1;i<=n;++i)
		if(add(t[i]))
			++k,l+=s[t[i]];
	printf("%d %d\n",k,l);
}