提交时间:2024-10-09 22:00:55

运行 ID: 33554

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=1005; const int mod1=998244353,mod2=1e9+7,mod3=1e9+9; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n; namespace Sub1 { #define mod mod1 int a[705][1405],d[705][705],p[705][705],b[705]; int qpow(int a,int b){ int res=1; while(b){ if(b&1)res=res*1ll*a%mod; a=a*1ll*a%mod;b>>=1; }return res; } void Gauss(){ up(i,1,n)a[i][i+n]=1; up(i,1,n){ int j=i; while(j<=n&&(!a[j][i]))j++; up(k,1,2*n)swap(a[i][k],a[j][k]); up(j,1,n){ if(i==j)continue; int t=qpow(a[i][i],mod-2)%mod*1ll*a[j][i]%mod; up(k,1,2*n)a[j][k]=(a[j][k]+mod-a[i][k]*1ll*t%mod)%mod; } } up(i,1,n){ int x=qpow(a[i][i],mod-2); up(j,n+1,2*n)a[i][j]=a[i][j]*1ll*x%mod; } up(i,1,n)up(j,1,n)a[i][j]=a[i][j+n]; } struct nd { int k,b; nd(int _k,int _b){k=_k,b=_b;} nd(){} }T[maxn]; int ad(int x,int y){return ((x+y>=mod)?(x+y-mod):(x+y));} inline nd operator+(nd a,nd b){ return nd(ad(a.k,b.k),ad(a.b,b.b)); } inline nd operator*(nd a,int b){ return nd(a.k*1ll*b%mod,a.b*1ll*b%mod); } void slv(){ up(i,2,n)up(j,1,i-1)d[i][j]=d[j][i]=read(); up(i,2,n)up(j,1,i-1)p[i][j]=p[j][i]=read(); up(i,1,n){ if(i==n)continue; int all=0;up(j,1,n)(all+=p[i][j])%=mod; up(j,1,n){ a[i][j]=p[i][j]*1ll*qpow(all,mod-2)%mod; int f=d[i][j]*1ll*p[i][j]%mod*1ll*qpow(all,mod-2)%mod; b[i]=(b[i]+mod-f)%mod; } }up(i,1,n)a[i][i]=mod-1;Gauss(); up(ex,1,n-1){ up(i,1,n)T[i]=nd(0,0); up(i,1,n){ up(j,1,n){ int x=a[i][j]; if(j^ex)T[i]=T[i]+nd(0,x*1ll*b[j]%mod); else T[i]=T[i]+nd(x,0); } } int real=(mod-T[ex].b)*1ll*qpow(T[ex].k,mod-2)%mod; up(i,1,n-1){ int val=T[i].k*1ll*real%mod+T[i].b; printf("%d ",val%mod); }printf("\n"); } } #undef mod } namespace Sub2 { #define mod mod2 int a[705][1405],d[705][705],p[705][705],b[705]; int qpow(int a,int b){ int res=1; while(b){ if(b&1)res=res*1ll*a%mod; a=a*1ll*a%mod;b>>=1; }return res; } void Gauss(){ up(i,1,n)a[i][i+n]=1; up(i,1,n){ int j=i; while(j<=n&&(!a[j][i]))j++; up(k,1,2*n)swap(a[i][k],a[j][k]); up(j,1,n){ if(i==j)continue; int t=qpow(a[i][i],mod-2)%mod*1ll*a[j][i]%mod; up(k,1,2*n)a[j][k]=(a[j][k]+mod-a[i][k]*1ll*t%mod)%mod; } } up(i,1,n){ int x=qpow(a[i][i],mod-2); up(j,n+1,2*n)a[i][j]=a[i][j]*1ll*x%mod; } up(i,1,n)up(j,1,n)a[i][j]=a[i][j+n]; } struct nd { int k,b; nd(int _k,int _b){k=_k,b=_b;} nd(){} }T[maxn]; int ad(int x,int y){return ((x+y>=mod)?(x+y-mod):(x+y));} inline nd operator+(nd a,nd b){ return nd(ad(a.k,b.k),ad(a.b,b.b)); } inline nd operator*(nd a,int b){ return nd(a.k*1ll*b%mod,a.b*1ll*b%mod); } void slv(){ up(i,2,n)up(j,1,i-1)d[i][j]=d[j][i]=read(); up(i,2,n)up(j,1,i-1)p[i][j]=p[j][i]=read(); up(i,1,n){ if(i==n)continue; int all=0;up(j,1,n)(all+=p[i][j])%=mod; up(j,1,n){ a[i][j]=p[i][j]*1ll*qpow(all,mod-2)%mod; int f=d[i][j]*1ll*p[i][j]%mod*1ll*qpow(all,mod-2)%mod; b[i]=(b[i]+mod-f)%mod; } }up(i,1,n)a[i][i]=mod-1;Gauss(); up(ex,1,n-1){ up(i,1,n)T[i]=nd(0,0); up(i,1,n){ up(j,1,n){ int x=a[i][j]; if(j^ex)T[i]=T[i]+nd(0,x*1ll*b[j]%mod); else T[i]=T[i]+nd(x,0); } } int real=(mod-T[ex].b)*1ll*qpow(T[ex].k,mod-2)%mod; up(i,1,n-1){ int val=T[i].k*1ll*real%mod+T[i].b; printf("%d ",val%mod); }printf("\n"); } } #undef mod } namespace Sub3 { #define mod mod3 int a[705][1405],d[705][705],p[705][705],b[705]; int qpow(int a,int b){ int res=1; while(b){ if(b&1)res=res*1ll*a%mod; a=a*1ll*a%mod;b>>=1; }return res; } void Gauss(){ up(i,1,n)a[i][i+n]=1; up(i,1,n){ int j=i; while(j<=n&&(!a[j][i]))j++; up(k,1,2*n)swap(a[i][k],a[j][k]); up(j,1,n){ if(i==j)continue; int t=qpow(a[i][i],mod-2)%mod*1ll*a[j][i]%mod; up(k,1,2*n)a[j][k]=(a[j][k]+mod-a[i][k]*1ll*t%mod)%mod; } } up(i,1,n){ int x=qpow(a[i][i],mod-2); up(j,n+1,2*n)a[i][j]=a[i][j]*1ll*x%mod; } up(i,1,n)up(j,1,n)a[i][j]=a[i][j+n]; } struct nd { int k,b; nd(int _k,int _b){k=_k,b=_b;} nd(){} }T[maxn]; int ad(int x,int y){return ((x+y>=mod)?(x+y-mod):(x+y));} inline nd operator+(nd a,nd b){ return nd(ad(a.k,b.k),ad(a.b,b.b)); } inline nd operator*(nd a,int b){ return nd(a.k*1ll*b%mod,a.b*1ll*b%mod); } void slv(){ up(i,2,n)up(j,1,i-1)d[i][j]=d[j][i]=read(); up(i,2,n)up(j,1,i-1)p[i][j]=p[j][i]=read(); up(i,1,n){ if(i==n)continue; int all=0;up(j,1,n)(all+=p[i][j])%=mod; up(j,1,n){ a[i][j]=p[i][j]*1ll*qpow(all,mod-2)%mod; int f=d[i][j]*1ll*p[i][j]%mod*1ll*qpow(all,mod-2)%mod; b[i]=(b[i]+mod-f)%mod; } }up(i,1,n)a[i][i]=mod-1;Gauss(); up(ex,1,n-1){ up(i,1,n)T[i]=nd(0,0); up(i,1,n){ up(j,1,n){ int x=a[i][j]; if(j^ex)T[i]=T[i]+nd(0,x*1ll*b[j]%mod); else T[i]=T[i]+nd(x,0); } } int real=(mod-T[ex].b)*1ll*qpow(T[ex].k,mod-2)%mod; up(i,1,n-1){ int val=T[i].k*1ll*real%mod+T[i].b; printf("%d ",val%mod); }printf("\n"); } } #undef mod } void slv(){ n=read()+1;int M=read(); if(M==mod1)Sub1::slv(); else if(M==mod2)Sub2::slv(); else Sub3::slv(); } int main(){ //freopen("roam.in","r",stdin); //freopen("roam.out","w",stdout); slv(); fclose(stdin); fclose(stdout); //cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; }