这题太神了,所以直接看了题解 http://www.cnblogs.com/jianglangcaijin/archive/2013/12/06/3462328.html 将狼踩进讲得很详细。公式变换太美我不敢看。还有取模的时候要判书不是0,有数据刚好是mod的倍数。。。。。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
#define fore(i,u) for(i=first[u];i;i=next[i])
#define maxn 210000
#define ll long long
int n,m,mod;
int en,next[maxn],first[maxn],to[maxn];
int vis[maxn];
ll f[maxn][20][3];
void add(int a,int b)
{
en++;
to[en]=b;
next[en]=first[a];
first[a]=en;
}
void dfs(int now)
{
vis[now]=1;
int i;
for(int i=first[now];i;i=next[i])
{
int v=to[i];
if(!vis[v])
dfs(v);
}
}
ll mul(ll tmp)
{
if(tmp%mod!=0) return tmp%mod;
if(tmp!=0) return mod;
return 0;
}
void dp(int now,int fa,int use)
{
f[now][use][0]=1;
f[now][use][1]=f[now][use][2]=0;
int i,v;
ll f1,f2;
for(int i=first[now];i;i=next[i])
{
v=to[i];
if(v==fa) continue;
dp(v,now,use);
f1=f[v][use][0]+f[v][use][1];
if(!use) f2=0;
else f2=f[v][use-1][0]+f[v][use-1][1]+f[v][use-1][2];
f[now][use][2]=mul(mul(f[now][use][2]*f2)+mul(f[now][use][1]*f1));
f[now][use][1]=mul(mul(f[now][use][0]*f1)+mul(f[now][use][1]*f2));
f[now][use][0]=mul(f[now][use][0]*f2);
}
}
int main()
{
int a,b;
scanf("%d%d%d",&n,&m,&mod);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
}
dfs(1);
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
puts("-1"); puts("-1");
return 0;
}
}
for(int i=0;;i++)
{
dp(1,-1,i);
if(f[1][i][0]+f[1][i][1]+f[1][i][2])
{
printf("%d\n",i);
printf("%lld\n",(f[1][i][0]+f[1][i][1]+f[1][i][2])%mod);
return 0;
}
}
puts("-1"); puts("-1");
return 0;
}