码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj4004: [JLOI2015]装备购买 线性基

时间:2016-08-17 06:45:23      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

#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);
}

  

bzoj4004: [JLOI2015]装备购买 线性基

标签:

原文地址:http://www.cnblogs.com/f321dd/p/5778479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!