RT.
本机跑满分,开了O2也是满分。
然而
并且每次 tle 的点都有所不同。
#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
const int N=1e6+5;
int one[N],idx;
int ver[N],Next[N];
inline void AddEdge(int a,int b)
{
Next[++idx]=one[a];
one[a]=idx;
ver[idx]=b;
}
struct Frac
{
LL a;
LL c[6];
// a/b ;
}f[N];
inline Frac add(Frac x,Frac y)
{
Frac z;
int i;
for(i=2;i<=5;i++)
z.c[i]=min(x.c[i],y.c[i]);
Frac x0=x,y0=y;
for(i=2;i<=5;i++) {
int cnt=y0.c[i]-z.c[i];
while(cnt--) x.a*=i;
}
for(i=2;i<=5;i++) {
int cnt=x0.c[i]-z.c[i];
while(cnt--) y.a*=i;
}
Frac res;
for(i=2;i<=5;i++)
res.c[i]=x.c[i]+y.c[i]-z.c[i];
res.a=x.a+y.a;
for(i=2;i<=5;i++)
while(res.c[i]&&(res.a%i)==0)
res.c[i]--,res.a/=i;
return res;
}
int n,m;
int din[N],dout[N];
queue<int> q;
void topsort()
{
while(q.size()) q.pop();
int i;
int x,y;
for(i=1;i<=m;i++) f[i].a=1;
for(i=1;i<=n;i++)
if(din[i]==0)
q.push(i);
while(q.size()) {
x=q.front(); q.pop();
Frac z=f[x];
if(dout[x]==2) z.c[2]++;
else if(dout[x]==3) z.c[3]++;
else if(dout[x]==4) z.c[2]+=2;
else if(dout[x]==5) z.c[5]++;
for(i=one[x];i;i=Next[i]) {
y=ver[i];
f[y]=add(f[y],z);
din[y]--;
if(din[y]==0) q.push(y);
}
}
}
int main()
{
int i,j;
int y;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) {
scanf("%d",&dout[i]);
for(j=1;j<=dout[i];j++) {
scanf("%d",&y);
AddEdge(i,y);
din[y]++;
}
}
topsort();
for(i=1;i<=n;i++)
if(dout[i]==0) {
LD z=1;
for(j=1;j<=5;j++)
for(int k=f[i].c[j];k>=1;k--)
z*=j;
printf("%lld %.0lf\n",f[i].a,(double)z);
}
return 0;
}