Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
33560 | LYLAKIOI | 【BJ】T1 | C++ | 通过 | 100 | 2644 MS | 7904 KB | 7095 | 2024-10-09 22:15:44 |
#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; } inline int sub(int x,int y){ return ((x>=y)?(x-y):(x+mod-y)); } 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]=sub(a[j][k],a[i][k]*1ll*t%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]; } int T1[maxn],T2[maxn]; inline int ad(int x,int y){return ((x+y>=mod)?(x+y-mod):(x+y));} 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)T1[i]=T2[i]=0; up(i,1,n){ int f1=0,f2=0; up(j,1,n){ int x=a[i][j]; if(j^ex)f2=ad(f2,x*1ll*b[j]%mod); else f1=ad(f1,x); }T1[i]=f1,T2[i]=f2; } int real=(mod-T2[ex])*1ll*qpow(T1[ex],mod-2)%mod; up(i,1,n-1){ int val=ad(T1[i]*1ll*real%mod,T2[i]); 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; } inline int sub(int x,int y){ return ((x>=y)?(x-y):(x+mod-y)); } 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]=sub(a[j][k],a[i][k]*1ll*t%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]; } int T1[maxn],T2[maxn]; inline int ad(int x,int y){return ((x+y>=mod)?(x+y-mod):(x+y));} 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)T1[i]=T2[i]=0; up(i,1,n){ int f1=0,f2=0; up(j,1,n){ int x=a[i][j]; if(j^ex)f2=ad(f2,x*1ll*b[j]%mod); else f1=ad(f1,x); }T1[i]=f1,T2[i]=f2; } int real=(mod-T2[ex])*1ll*qpow(T1[ex],mod-2)%mod; up(i,1,n-1){ int val=ad(T1[i]*1ll*real%mod,T2[i]); 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; } inline int sub(int x,int y){ return ((x>=y)?(x-y):(x+mod-y)); } 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]=sub(a[j][k],a[i][k]*1ll*t%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]; } int T1[maxn],T2[maxn]; inline int ad(int x,int y){return ((x+y>=mod)?(x+y-mod):(x+y));} 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)T1[i]=T2[i]=0; up(i,1,n){ int f1=0,f2=0; up(j,1,n){ int x=a[i][j]; if(j^ex)f2=ad(f2,x*1ll*b[j]%mod); else f1=ad(f1,x); }T1[i]=f1,T2[i]=f2; } int real=(mod-T2[ex])*1ll*qpow(T1[ex],mod-2)%mod; up(i,1,n-1){ int val=ad(T1[i]*1ll*real%mod,T2[i]); 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; }