提交记录
#include<bits/stdc++.h>
using namespace std;
namespace wxh666{
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#define f(a,b,c) for(int a=b;a<=c;a++)
#define ff(a,b,c) for(int a=b;a>=c;a--)
#define g(x) f(i,1,x)
template<typename T>
inline void read(T &ans)
{
char ch=getchar();int f=1;ans=0;
for(;!isdigit(ch);ch=getchar()) ch=='-'?f=-1:f=1;
for(;isdigit(ch);ch=getchar()) ans=(ans<<3)+(ans<<1)+(ch&15);
ans*=f;
return;
}
template<typename T,typename ...Args>
inline void read(T &tmp,Args &...tmps){read(tmp);read(tmps...);}
inline int read()
{
char ch=getchar();int f=1,ans=0;
for(;!isdigit(ch);ch=getchar()) ch=='-'?f=-1:f=1;
for(;isdigit(ch);ch=getchar()) ans=(ans<<3)+(ans<<1)+(ch&15);
return f*ans;
}
#define in read()
};using namespace wxh666;
namespace lsq {
typedef int lsqxx;
struct lq {
struct lqbz {
lsqxx v,w,nxt;
} e[1000005];
lsqxx h[100005],cnt;
inline void add(lsqxx u,lsqxx v,lsqxx w=1) {
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].nxt=h[u];
h[u]=cnt;
}
void erase() {cnt=0;memset(h,0,sizeof(h));return;}
#define F(z,u) for(int j=z.h[u],v=z.e[j].v,w=z.e[j].w;j;j=z.e[j].nxt,v=z.e[j].v,w=z.e[j].w)
}q;
};
using namespace lsq;
int n,m;
int w[100005];
int x,y;
int low[100005],dfn[100005],dfns,scc;
int dis[100005],vis[100005],bs[100005],sz[100005];
stack<int>s;
void tarjan(int t)
{
low[t]=dfn[t]=++dfns;s.push(t);vis[t]=dis[t]=1;
F(q,t)
{
if(!dfn[v]) tarjan(v),low[t]=min(low[t],low[v]);
else if(dis[v]) low[t]=min(low[t],dfn[v]);
}
if(dfn[t]==low[t])
{
++scc;int k;
do{
bs[k=s.top()]=scc;++sz[scc];
low[k]=t,dis[k]=0;s.pop();
}while(k!=t);
}
}
int cnt[100005],cnts[100005],ans,anss=1;
const int mod=1e9+7;
int main()
{
cin>>n;
g(n) w[i]=in;
cin>>m;
g(m) read(x,y),q.add(x,y);
g(n) if(!dfn[i]) tarjan(i);
g(scc) cnt[i]=0x7f7f7f7f;
g(n)
if(cnt[bs[i]]>w[i])
cnt[bs[i]]=w[i],cnts[i]=1;
else if(cnt[bs[i]]==w[i])
cnts[bs[i]]++;
g(scc) ans+=cnt[bs[i]],anss=(anss*cnts[i])%mod;
cout<<ans<<" "<<anss<<endl;
return 0;
}