高斯消元

[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]='\n';
}
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

 

posted @ 2021-10-14 16:02  尹吴潇  阅读(29)  评论(0编辑  收藏  举报