zoukankan      html  css  js  c++  java
  • 高斯消元

    [HNOI2013]游走 这个的方程比较经典

    hdoj 7109 n^3预处理n^2询问修改矩阵最后一列

    //#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
    //#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
    
    //#include <immintrin.h>
    //#include <emmintrin.h>
    #include <bits/stdc++.h>
    using namespace std;
    #define rep(i,h,t) for (int i=h;i<=t;i++)
    #define dep(i,t,h) for (int i=t;i>=h;i--)
    #define ll long long
    #define me(x) memset(x,0,sizeof(x))
    #define IL inline
    #define rint register int
    
    //unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    //mt19937 myrand(seed);
    //uniform_int_distribution<ll>dist(1,10000000);
    //dist(myrand);
    inline ll rd(){
        ll x=0;char c=getchar();bool f=0;
        while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
        while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
        return f?-x:x;
    }
    char ss[1<<26],*A=ss,*B=ss;
    IL char gc()
    {
        return A==B&&(B=(A=ss)+fread(ss,1,1<<26,stdin),A==B)?EOF:*A++;
    }
    template<class T>void maxa(T &x,T y)
    {
        if (y>x) x=y;
    }
    template<class T>void mina(T &x,T y)
    {
        if (y<x) x=y;
    }
    template<class T>void read(T &x)
    {
        int f=1,c; while (c=gc(),c<48||c>57) if (c=='-') f=-1; x=(c^48);
        while(c=gc(),c>47&&c<58) x=x*10+(c^48); x*=f;
    }
    char sr[1<<26],z[20]; int C=-1,Z;
    template <class T> void wer(T x)
    {
      if (x<0) sr[++C]='-',x=-x;
      while (z[++Z]=x%10+48,x/=10);
      while (sr[++C]=z[Z],--Z); sr[++C]='
    ';
    }
    const int mo=998244353;
    ll fsp(int x,int y)
    {
        if (y==1) return x;
        ll ans=fsp(x,y/2);
        ans=ans*ans%mo;
        if (y%2==1) ans=ans*x%mo;
        return ans;
    }
    struct cp {
        ll x,y;
        cp operator +(cp B)
        {
            return (cp){x+B.x,y+B.y};
        }
        cp operator -(cp B)
        {
            return (cp){x-B.x,y-B.y};
        }
        ll operator *(cp B)
        {
            return x*B.y-y*B.x;
        }
        int half() { return y < 0 || (y == 0 && x < 0); }
    };
    struct re{
        int a,b,c;
    };
    const int N=510;
    int w[N],siz[N],pp[11];
    ll h[N][10],gl[N];
    re g[N][N];
    int n,m,q;
    struct gauss{
      ll jl[N][N],f[N][N],ans[N];
      void Gauss()
      {
          n--; 
        rep(i,1,n) jl[i][i]=1;
        rep(i,1,n)
        {
          int kk=fsp(f[i][i],mo-2); 
          rep(j,1,n)
            if (i!=j)
            {
              ll t=-1ll*f[j][i]*kk%mo;
              rep(k,1,n) (f[j][k]+=t*f[i][k])%=mo;
              rep(k,1,n) (jl[j][k]+=t*jl[i][k])%=mo;
            }
        }
        rep(i,1,n)
        {
          int kk=fsp(-f[i][i],mo-2);
          rep(j,1,n) jl[i][j]=jl[i][j]*kk%mo;
        }
        n++;
      }
      inline ll js()
      {
        ll anss=0;
          rep(i,1,n-1)
          {
              ans[i]=0;
              rep(j,1,n-1) (ans[i]+=jl[i][j]*h[j][7])%=mo; 
          }
          rep(i,1,n-1)
            rep(j,1,n)
              if (g[i][j].b)
              {
                  (anss+=ans[i]*gl[i]%mo*g[i][j].b)%=mo;
              }
          return anss;
      }
    } M;
    ll ans=0,ans2=0;
    inline void cl()
    {
       ans=0;
       ll sum=0;
       rep(i,1,n) sum+=w[i]; sum=fsp(sum,mo-2); 
       rep(i,1,n) gl[i]=fsp(siz[i],mo-2);
       rep(i,1,n-1) h[i][0]=w[i]*sum%mo;
       rep(i,1,7)
         rep(j,1,n-1)
         {
           h[j][i]=0;
           rep(k,1,n)
             if (g[j][k].a) (h[j][i]+=h[k][i-1]*gl[k])%=mo;
         }
       pp[0]=1; rep(i,1,10) pp[i]=pp[i-1]*2;
       rep(i,0,6)
         rep(j,1,n-1)
           rep(k,1,n)
             if (g[j][k].a) (ans+=h[j][i]*gl[j]%mo*max(g[j][k].a/pp[i],g[j][k].b))%=mo;
    }
    inline void pr()
    {
        ll now=((ans+ans2)%mo+mo)%mo;
        wer(now);
    }
    int main()
    {
       ios::sync_with_stdio(false);
       read(n); read(m);read(q);
       rep(i,1,n-1) read(w[i]);
       rep(i,1,m)
       {
            int x,y,a,b;
            read(x); read(y); read(a); read(b); 
            siz[x]++; siz[y]++;
         g[x][y]=(re){a,b};
         g[y][x]=(re){a,b};
       }
       cl();
       rep(i,1,n-1)
       { 
         M.f[i][i]=-1;
         rep(j,1,n-1)
           if (g[i][j].a)
             M.f[i][j]=gl[j];
       }
       M.Gauss();
       ans2=M.js();
       pr();
       while (q--)
       {
            int kk,x,y,a,b,c;
            read(kk);
            if (kk==1)
            {
               read(x); read(y); read(a); read(b);
               if (x!=n) rep(i,0,6) (ans-=h[x][i]*gl[x]%mo*max(g[x][y].a/pp[i],g[x][y].b))%=mo;
               if (y!=n) rep(i,0,6) (ans-=h[y][i]*gl[y]%mo*max(g[y][x].a/pp[i],g[y][x].b))%=mo;
               if (x!=n) (ans-=M.ans[x]*gl[x]%mo*g[x][y].b)%=mo;
               if (y!=n) (ans-=M.ans[y]*gl[y]%mo*g[y][x].b)%=mo;
               g[x][y]=g[y][x]=(re){a,b};
               if (x!=n) rep(i,0,6) (ans+=h[x][i]*gl[x]%mo*max(g[x][y].a/pp[i],g[x][y].b))%=mo;
               if (y!=n) rep(i,0,6) (ans+=h[y][i]*gl[y]%mo*max(g[y][x].a/pp[i],g[y][x].b))%=mo;
               if (x!=n) (ans+=M.ans[x]*gl[x]%mo*g[x][y].b)%=mo;
               if (y!=n) (ans+=M.ans[y]*gl[y]%mo*g[y][x].b)%=mo;
            } else
            {
                read(x); read(c);
                w[x]=c; cl(); ans2=M.js();
            }
            pr();
       }
       fwrite(sr,1,C+1,stdout);
       return 0;
    }
    View Code
  • 相关阅读:
    STL实现的底层数据结构简介
    C++ STL中Map的按Key排序和按Value排序
    algorithm库介绍之---- stable_sort()方法 与 sort()方法 .
    git取消更改 恢复版本命令
    unbuntu下清理磁盘空间
    x265编码命令
    SQLServer数据库获取重复记录中日期最新的记录
    牛逼哄哄的 Lambda 表达式,简洁优雅就是生产力!
    哎!又要过年了,程序员最怕问到什么?
    swagger 使用指南
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/15407108.html
Copyright © 2011-2022 走看看