这样就行了:
```
#include<iostream>
#include<cstdio>
typedef long long ll;
#define maxn 5001
#define maxm 1000001
#define mod 80112002
ll n,m;
struct Edge
{
ll v,nxt;
}e[maxm];
ll cnt=0,last[maxn],din[maxn],dout[maxn];
void adde(ll u,ll v)
{
++cnt;
++dout[u];++din[v];
e[cnt].v=v;
e[cnt].nxt=last[u];last[u]=cnt;
}
ll f[maxn];
struct que
{
ll a[maxn<<1|1],h,t;
que(){h=t=1;}
void push(ll x)
{
a[t++]=x;
}
void pop(){++h;}
ll front()
{
return a[h];
}
bool empty()
{
return h==t;
}
}q;
void topo()
{
for(ll i=1;i<=n;++i)
if(!din[i])q.push(i),f[i]=1;
while(!q.empty())
{
ll u=q.front();q.pop();
for(ll i=last[u];i;i=e[i].nxt)
{
f[e[i].v]+=f[u];
f[e[i].v]%=mod;
if(!--din[e[i].v])q.push(e[i].v);
}
}
}
int main()
{
scanf("%lld%lld",&n,&m);
ll u,v;
for(ll i=1;i<=m;++i)
{
scanf("%lld%lld",&u,&v);
adde(u,v);
}
topo();
ll ans=0;
for(ll i=1;i<=n;++i)
if(!dout[i])ans=(ans+f[i])%mod;
printf("%lld",ans);
return 0;
}
```
by 陈启旺 @ 2019-04-09 21:14:01
额
by comfort @ 2019-04-09 21:30:08
@[刷水题的蒟蒻](/space/show?uid=48981) orz lyc
by _bql @ 2019-07-11 15:55:44