总之就是线性基那一套贪心理论直接做就好了。
然而加强数据后很卡精度的样子。
于是重点在于这个特技:在整数模意义下搞。
#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); }