手铐

手铐

http://www.nowcoder.com/questionTerminal/7bf90aa120964bafa809e4878a09fe98

include

include

include<stdio.h>

include

include

include

include

include

include

using namespace std;
const int mod=19260817;
struct pp
{
int to,nxt;
};
pp er[10010000],ec[10010000];
int head[1001000],he[1001000],cmft,cw;
int pa[1001000],n,m,dist[2001000],e[2][2001000],pos[1001000],cnt;
bool vis[1001000];
int at[1001000],cnt_cir,ans,inv,se[1001000];
long long sz[1001000];
void addedge(int u,int v)
{
er[++cmft].to=v;
er[cmft].nxt=head[u];
head[u]=cmft;
}
void dfs(int id)
{
int i,j,s,p,q,ip;
vis[id]=true;
pos[id]=cnt++;
for(i=head[id];i;i=er[i].nxt)//for(i=0;i<adj[id].size();i++)
{
ip=er[i].to;
//ip=adj[id][i];
if(!vis[ip])
{
pa[ip]=id;
dfs(ip);
}
}
}
void gpr(int id,int pr,int awp,int iv)
{
int i,j,s,p,q,ip,ie;
long long tbd=0;
// puts("orz");
if(at[id]>=0&&at[id]+n!=pr)
{
//puts("ab");
sz[id]=awp;
long long tz=awp;
awp=(awp<<1)%mod;
iv=1LLivinv%mod;
ie=at[id];
for(i=he[ie];i;i=ec[i].nxt)//for(i=0;i<cir[ie].size();i++)
{
ip=ec[i].to;
// ip=cir[ie][i];
if(ip==id)
continue;
gpr(ip,at[id]+n,awp,iv);
sz[id]+=sz[ip];
}
// puts("cd");
sz[id]%=mod;
tbd=(tbd+sz[id]sz[id]-tztz)%mod;
for(i=he[ie];i;i=ec[i].nxt)//for(i=0;i<cir[ie].size();i++)
{
ip=ec[i].to;
// ip=cir[ie][i];
if(ip==id)
continue;
tbd=(tbd-sz[ip]sz[ip])%mod;
}
tbd=tbd
inv%mod;
ans=(ans+tbdiv%modiv*2)%mod;

}
else
{
      sz[id]=0;
      for(i=head[id];i;i=er[i].nxt)// for(i=0;i<adj[id].size();i++)
      {
        ip=er[i].to;
         // ip=adj[id][i];
          if((at[id]==at[ip]&&at[id]>=0)||ip==pr)
             continue;
          gpr(ip,id,awp,iv);
          sz[id]+=sz[ip];
      }
      sz[id]%=mod;
      tbd=(tbd+sz[id]*sz[id])%mod;
      for(i=head[id];i;i=er[i].nxt)//for(i=0;i<adj[id].size();i++)
      {
            ip=er[i].to;
          // ip=adj[id][i];
           if((at[id]==at[ip]&&at[id]>=0)||ip==pr)
              continue;
           tbd=(tbd-sz[ip]*sz[ip])%mod;
      }
      tbd=tbd*inv%mod;
      ans=(ans+tbd*iv%mod*iv)%mod;
}

}
int power(int a,int n)
{
if(n==0)
return 1;
int ret=power(a,n/2);
ret=1LLretret%mod;
if(n%2)
ret=1LLreta%mod;
return ret;
}
int main()
{
int i,j,s,p,q,u,v;
scanf("%d%d",&n,&m);
inv=power(2,mod-2);
cmft=0;
for(i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
u--;
v--;
addedge(u,v);
addedge(v,u);
//adj[u].push_back(v);
// adj[v].push_back(u);
e[0][i]=u;
e[1][i]=v;
}
cnt=0;
dfs(0);
memset(at,-1,sizeof(at));
cnt_cir=0;
cw=0;
for(i=0;i<m;i++)
{
u=e[0][i];
v=e[1][i];
if(pos[u]>pos[v])
swap(u,v);
if(pa[v]!=u)
{
while(true)
{
ec[++cw].to=v;
ec[cw].nxt=he[cnt_cir];
he[cnt_cir]=cw;
// cir[cnt_cir].push_back(v);
at[v]=cnt_cir;
if(v==u)
break;
v=pa[v];
}
cnt_cir++;
}
}
ans=0;
gpr(0,-1,1,1);
if(ans<0)
ans+=mod;
printf("%d\n",ans);
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务