P4111 [HEOI2015]小 Z 的房间 题解


题面

板子。注意模数不是质数的 \(\det\)

inline int det(int n){
	int res=1;bool flag=0;
	for(int i=1;i<=n;++i)
		for(int j=i+1;j<=n;++j){
			while(a[i][i]){
				int tmp=a[j][i]/a[i][i];
				for(int k=i;k<=n;++k) modadd(a[j][k],(ll)(mod-tmp)*a[i][k]%mod);
				std::swap(a[i],a[j]);flag^=1;
			}
			std::swap(a[i],a[j]);flag^=1;
		}
	for(int i=1;i<=n;++i) res=(ll)res*a[i][i]%mod;
	return flag?mod-res:res;
}

复杂度应该是 \(O(n^2(n+\log p))\)