浮点高斯消元:
int gsxy(int n,int m)
{
int i=1;
for(int j=1;i<=n && j<=m;j++)
{
int x=i;
for(int k=i+1;k<=n;k++)
if(!zero(a[k][j]) && fabs(a[k][j])>fabs(a[x][j]))
x=k;
if(zero(a[x][j]))continue;
for(int k=j;k<=m;k++)
swap(a[i][k],a[x][k]);
for(int k=1;k<=n;k++)
{
if(k==i || zero(a[k][j]))continue;
double f=a[k][j]/a[i][j];
for(int l=j;l<=m;l++)
a[k][l]-=a[i][l]*f;
}
for(int k=m;k>=j;k--)
a[i][k]/=a[i][j];
i++;
}
return i-1;
}
模意义下高斯消元
int gsxy(int n,int m)
{
int i=1;
for(int j=1;i<=n && j<=m;++j)
{
int x=i;
for(int k=i+1;k<=n;++k)
if(a[k][j] && abs(a[k][j])>abs(a[x][j]))
x=k;
if(!a[x][j])continue;
for(int k=j;k<=m;++k)
swap(a[i][k],a[x][k]);
for(int k=1;k<=n;++k)
{
if(k==i || !a[k][j])continue;
ll f=a[k][j]*qpow(a[i][j],mod-2)%mod;
for(int l=j;l<=m;++l)
{
a[k][l]-=a[i][l]*f%mod;
if(a[k][l]<=-mod)a[k][l]%=mod;
if(a[k][l]<0)a[k][l]+=mod;
}
}
for(int k=m;k>=j;--k)
(a[i][k]*=qpow(a[i][j],mod-2))%=mod;
++i;
}
return i-1;
}
整数行列式求值:
ll a[205][205],mod;
ll det(int n)
{
ll ans=1,f=1;
for(int i=1; i<=n; i++)
{
for(int j=i+1; j<=n; j++)
{
int x=i,y=j;
while(a[y][i])
{
ll t=a[x][i]/a[y][i];
for(int k=i; k<=n; k++)
a[x][k]=(a[x][k]-a[y][k]*t%mod)%mod;
swap(x,y);
}
if(x!=i)
{
for(int k=1; k<=n; k++)
swap(a[i][k],a[j][k]);
f=-f;
}
}
ans=ans*a[i][i]%mod;
}
return (ans*f+mod)%mod;
}
异或消元:
int xorxy(int n,int m)
{
int i=1;
for(int j=1; i<=n && j<=m; j++)
{
int x=0;
for(int k=i; k<=n; k++)
if(b[k][j])
{
x=k;
break;
}
if(!x)continue;
for(int k=j;k<=m;k++)
swap(b[i][k],b[x][k]);
for(int k=1;k<=n;k++)
{
if(k==i || !b[k][j])continue;
for(int l=j;l<=m;l++)
b[k][l]^=b[i][l];
}
i++;
}
return i-1;
}
网友评论