1 条题解
-
1
#include<bits/stdc++.h> #define int long long using namespace std; struct fs { unsigned int cnt2,cnt3,cnt5; long double fz; fs operator +(const fs x) { fs tmp=(fs){max(cnt2,x.cnt2),max(cnt3,x.cnt3),max(cnt5,x.cnt5),0}; long double tmp1=fz*pow(2,tmp.cnt2-cnt2)*pow(3,tmp.cnt3-cnt3)*pow(5,tmp.cnt5-cnt5); long double tmp2=x.fz*pow(2,tmp.cnt2-x.cnt2)*pow(3,tmp.cnt3-x.cnt3)*pow(5,tmp.cnt5-x.cnt5); tmp1+=tmp2; while(round(tmp1/2)*2==tmp1&&tmp.cnt2>0)--tmp.cnt2,tmp1/=2; while(round(tmp1/3)*3==tmp1&&tmp.cnt3>0)--tmp.cnt3,tmp1/=3; while(round(tmp1/5)*5==tmp1&&tmp.cnt5>0)--tmp.cnt5,tmp1/=5; tmp.fz=tmp1; return tmp; } }ans[100001]; int n,m,d[100001],a[100001][11],in[100001],vis[100001]; void dfs(int i) { vis[i]=1; if(--in[i]<=0) { if(d[i]) { fs tmp=ans[i]; if(d[i]==2)tmp.cnt2+=1; if(d[i]==3)tmp.cnt3+=1; if(d[i]==4)tmp.cnt2+=2; if(d[i]==5)tmp.cnt5+=1; for(int j=1;j<=d[i];j++)ans[a[i][j]]=ans[a[i][j]]+tmp,dfs(a[i][j]); } } } signed main() { freopen("water.in","r",stdin); freopen("water.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&d[i]); for(int j=1;j<=d[i];j++)scanf("%d",&a[i][j]),++in[a[i][j]]; } for(int i=1;i<=m;i++)ans[i].fz=1; for(int i=1;i<=n;i++)if(in[i]==0&&vis[i]==0)dfs(i); for(int i=1;i<=n;i++) { if(d[i]==0) { printf("%.0Lf %.0Lf\n",ans[i].fz,((long double)pow(2,ans[i].cnt2))*pow(3,ans[i].cnt3)*pow(5,ans[i].cnt5)); } } return 0; }
- 1
信息
- ID
- 6013
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- 递交数
- 21
- 已通过
- 5
- 上传者