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

The Evaluation of Determinant(求行列式mod一个数的值)

时间:2017-01-24 20:05:27      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:namespace   min   val   cstring   style   exp   end   lag   nan   

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#define LL long long
using namespace std;
LL n,m,A[105][105],p[10000],pos,d[105],r[105],len,B[105][105];
bool vd[10005]={0};
void prime()
{
    pos=0;
    for(int i=2;i<10005;i++)
    {
        if(!vd[i])
        {
            if(i>1000) p[pos++]=i;
            for(int j=(i<<1);j<10005;j+=i)
                vd[i]=1;
        }
    }
}
void deal(LL k)
{
    len=0;
    for(int i=0;i<pos&&k!=1;i++)
    {
        if(k%p[i]==0)
        {
            while(k%p[i]==0)
            {
                d[len++]=p[i];
                k/=p[i];
            }
        }
    }
}
LL exp(LL a,LL b,LL mod)
{
    LL ans=1;
    while(b)
    {
        if(b&1)ans=ans*a%mod;
        a=a*a%mod;b>>=1;
    }
    return ans;
}
void ex_gcd(LL a,LL b,LL &dd,LL &x,LL &y)
{
    if(b==0)
        x=1,y=0,dd=a;
    else
    {
        ex_gcd(b,a%b,dd,y,x);
        y-=x*(a/b);
    }
}
LL gauss(LL mod)
{
    bool flag=0;
    LL ans=1;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            B[i][j]=A[i][j];
    for(int k=0;k<n-1;k++)
    {
        LL max_b=B[k][k];int bin=k;
        for(int i=k+1;i<n;i++)
            if(B[i][k]>max_b)
                max_b=B[i][k],bin=i;
        if(bin!=k)
        {
            for(int i=k;i<n;i++)
                swap(B[bin][i],B[k][i]);
            flag^=1;
        }
        if(B[k][k]<0)B[k][k]+=mod;
        LL Ni,y,dd;
        ex_gcd(B[k][k],mod,dd,Ni,y);
        Ni%=mod;
        if(Ni<0)Ni+=mod;
        for(int j=k+1;j<n;j++)
        {
            B[k][j]=B[k][j]*Ni%mod;
            if(B[k][j]<0)B[k][j]+=mod;
            for(int i=k+1;i<n;i++)
            {
                B[i][j]=(B[i][j]-(B[k][j]*B[i][k])%mod)%mod;
                if(B[i][j]<0)B[i][j]+=mod;
            }
        }
        ans*=B[k][k];
        ans%=mod;
        if(ans<0)ans+=mod;
    }
    ans*=B[n-1][n-1];
    ans%=mod;
    if(flag)ans=-ans;
    if(ans<0)ans+=mod;
    return ans;
}

LL china_remain()
{
    LL a,b,c,c1,c2,x,y,dd,N;
    a=d[0],c1=r[0];
    if(c1==0)c1=d[0];
    for(int i=1;i<len;i++)
    {
        b=d[i],c2=r[i];
        ex_gcd(a,b,dd,x,y);
        c=c2-c1;
        LL b1=b/dd;
        x=((c/dd*x)%b1+b1)%b1;
        c1=a*x+c1;
        a=a*b1;
    }
    return c1%m;
}
int main()
{
    prime();
    while(cin>>n>>m)
    {
        deal(m);
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                cin>>A[i][j];
        if(m==1)
        {
            cout<<0<<endl;
            continue;
        }
        for(int i=0;i<len;i++)
        {
            r[i]=gauss(d[i]);
        }
        cout<<china_remain()<<endl;
    }
    return 0;
}

 

The Evaluation of Determinant(求行列式mod一个数的值)

标签:namespace   min   val   cstring   style   exp   end   lag   nan   

原文地址:http://www.cnblogs.com/hnqw1214/p/6347712.html

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