P3225已过
#include<cstdio>
#include<cstring>
#include<vector>
int h[50007],nx[100007],vx[100007],ec;
#define add(u,v) (nx[++ec]=h[u],vx[ec]=v,h[u]=ec)
int dfn[50007],low[50007],dc;
int stk[50007],tp;
bool cut[50007];
int bc;
void ckmn(int&a,int b){(a>b)&&(a=b);}
void ckmx(int&a,int b){(a<b)&&(a=b);}
std::vector<int> dcc[50007];
void dfs(int i,int l)
{
dfn[i]=low[i]=++dc;
stk[++tp]=i;
int cld=0;
for(int t=h[i];t;t=nx[t])
if(!dfn[vx[t]])
{
dfs(vx[t],i);
ckmn(low[i],low[vx[t]]);
if(low[vx[t]]>=dfn[i])
{
cut[i]=(l||(++cld)>=2);
dcc[++bc].push_back(i);
while(stk[tp]!=i)dcc[bc].push_back(stk[tp--]);
}
}
else if(vx[t]!=l)ckmn(low[i],dfn[vx[t]]);
}
int main()
{
int n,m,u,v,ans;
unsigned long long Ans;
for(int C=1;scanf("%d",&m),m;++C)
{
memset(dfn,ans=tp=ec=dc=bc=n=0,sizeof dfn);
memset(cut,0,sizeof cut);
memset(h,0,sizeof h);
for(int i=1;i<=m;++i)scanf("%d%d",&u,&v),ckmx(n,u),ckmx(n,v),add(u,v),add(v,u);
for(int i=1;i<=n;++i)if(!dfn[i])dfs(i,0);
for(int i=Ans=1;i<=bc;++i)
{
int siz=dcc[i].size(),csiz=0;
for(auto&u:dcc[i])csiz+=cut[u];
if(csiz==1)++ans,Ans*=siz-1;
else if(!csiz)ans+=2,Ans*=(siz*(siz-1)/2);
dcc[i].clear();
}
printf("Case %d: %d %llu\n",C,ans,Ans);
}
return 0;
}