Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
33451 | liuyile | 【BJ】T1 | C++ | 运行出错 | 0 | 0 MS | 268 KB | 3001 | 2024-10-09 15:09:48 |
#include <bits/stdc++.h> using namespace std; #define endl "\n" #define int long long #define pii pair<int,int> #define p1(x) x.first #define p2(x) x.second int n,M; int s[710],is[710]; int p[710][710],d[710][710]; int T[710][710],IT[710][710]; int b[710]; pii B[710]; pii x[710]; inline int qp(int a,int x){ int res=1; while(x){ if(x&1)res=res*a%M; a=a*a%M; x>>=1; } return res; } inline int inv(int x){return qp(x,M-2);} inline void add(int &x,int y){ if((x+=y)>=M)x-=M; } int A[710][710],CT[710][710]; signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); freopen("genshin.in","r",stdin); freopen("genshin.out","w",stdout); cin>>n>>M; for(int i=1;i<=n+1;i++) for(int j=1;j<i;j++) cin>>d[i][j],d[j][i]=d[i][j]; for(int i=1;i<=n+1;i++) for(int j=1;j<i;j++) cin>>p[i][j],p[j][i]=p[i][j]; for(int i=1;i<=n;i++){ for(int j=1;j<=n+1;j++) add(s[i],p[i][j]); is[i]=inv(s[i]); T[i][i]=1; for(int j=1;j<=n+1;j++) if(p[i][j])T[i][j]=M-(p[i][j]*is[i]%M),add(b[i],p[i][j]*is[i]%M*d[i][j]%M); } for(int i=1;i<=n;i++)IT[i][i]=1; memcpy(CT,T,sizeof(T)); for(int i=1;i<=n;i++){ int p=i; if(!T[i][i]){ for(int j=i+1;j<=n;j++) if(T[i][j])p=j; for(int j=1;j<=n;j++) swap(T[i][j],T[p][j]), swap(IT[i][j],IT[p][j]); } int IV=inv(T[i][i]); for(int j=1;j<=n;j++) T[i][j]=T[i][j]*IV%M, IT[i][j]=IT[i][j]*IV%M; for(int j=1;j<=n;j++) if(i!=j){ int p=T[j][i]; for(int k=1;k<=n;k++) T[j][k]=(T[j][k]-T[i][k]*p)%M, IT[j][k]=(IT[j][k]-IT[i][k]*p)%M; } } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) IT[i][j]=(IT[i][j]+M)%M; // return 0; // for(int i=1;i<=n;i++) // for(int j=1;j<=n;j++) // for(int k=1;k<=n;k++) // add(A[i][k],CT[i][j]*IT[j][k]%M); // for(int i=1;i<=n;i++,cout<<endl) // for(int j=1;j<=n;j++) // cout<<A[i][j]<<" "; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) if(i==j)B[j]={1,0}; else B[j]={0,b[j]}; for(int i=1;i<=n;i++){ pii e={0,0}; for(int j=1;j<=n;j++){ add(p1(e),IT[i][j]*p1(B[j])%M); add(p2(e),IT[i][j]*p2(B[j])%M); } x[i]=e; } int xv=(M-p2(x[i]))*inv(p1(x[i]))%M; // for(int i=1;i<=n;i++) // cout<<p1(x[i])<<"x+"<<p2(x[i])<<" "; // cout<<endl; for(int i=1;i<=n;i++) cout<<(p1(x[i])*xv%M+p2(x[i]))%M<<" "; cout<<endl; } cout.flush(); return 0; }