题目链接:落忆枫音

  以下内容参考PoPoQQQ大爷的博客

  首先我们先来考虑一下如果没有新加入的那条边,答案怎么算。

  由于这是一个\(DAG\),所以我们给每个点随便选择一条入边,最后一定会构成一个树形图。于是答案就是除\(1\)号点之外所有点的入度之积。

  现在新加入了一条边,如果形成了一个环并且\(1\)号点不在环上的话,我们给每个点随便选择入边,就可能会出现选出一个环的情况。

  所以,我们需要考虑把这部分答案给掉。令\(S_{x\to y}\)表示\(x\)到\(y\)的任意一条路径,\(degree_u\)表示点\(u\)的入度,不难发现,我们要减去的答案就是:

\(\sum_{S_{y\to x}}\prod_{u\notin S}degree_u\)

  然后我们就可以\(dp\)了。令\(f_i\)表示\(\sum_{S_{i\to x}}\prod_{u\notin S}degree_u\),那么转移就很好转了。注意边界是\(f_x\)。

  下面贴代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define mod 1000000007
#define maxn 100010
#define maxm 400010 using namespace std;
typedef long long llg; int n,m,du[maxn];
int head[maxn],next[maxm],to[maxm],tt;
llg f[maxn],ans;
bool vis[maxn]; int getint(){
int w=0;bool q=0;
char c=getchar();
while((c>'9'||c<'0')&&c!='-') c=getchar();
if(c=='-') c=getchar(),q=1;
while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
return q?-w:w;
} void gi(llg &x){if(x>=mod) x%=mod;}
llg mi(llg a,int b){
llg s=1;
while(b){
if(b&1) s=s*a,gi(s);
a=a*a,gi(a); b>>=1;
}
return s;
} llg dfs(int u){
if(vis[u]) return f[u]; vis[u]=1;
for(int i=head[u];i;i=next[i])
f[u]+=dfs(to[i]),gi(f[u]);
f[u]*=mi(du[u],mod-2);
gi(f[u]); return f[u];
} int main(){
File("maple");
n=getint(); m=getint();
int x=getint(),y=getint();
while(m--){
int u=getint(),v=getint(); du[v]++;
to[++tt]=v;next[tt]=head[u];head[u]=tt;
}
du[y]++; ans=1;
for(int i=2;i<=n;i++) ans*=du[i],gi(ans);
if(y!=1 && x!=1){
vis[x]=1; f[x]=ans*mi(du[x],mod-2);
gi(f[x]); ans-=dfs(y);
ans%=mod; if(ans<0) ans+=mod;
}
printf("%lld\n",ans);
return 0;
}

BZOJ 4011 【HNOI2015】 落忆枫音的更多相关文章

  1. BZOJ 4011: [HNOI2015]落忆枫音( dp )

    DAG上有个环, 先按DAG计数(所有节点入度的乘积), 然后再减去按拓扑序dp求出的不合法方案数(形成环的方案数). ---------------------------------------- ...

  2. BZOJ 4011: [HNOI2015]落忆枫音 计数 + 拓扑排序

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...

  3. BZOJ 4011 HNOI2015 落忆枫音 DAG上的dp(实际上重点在于分析)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 题意概述:给出一张N点的DAG(从1可以到达所有的点),点1的入度为0.现在加一条原 ...

  4. BZOJ 4011 HNOI2015 落忆枫音

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 题目很长,写得也很有诗意与浪漫色彩,让我们不禁感叹出题人是一个多么英俊潇洒的人. 所 ...

  5. 4011: [HNOI2015]落忆枫音

    4011: [HNOI2015]落忆枫音 链接 分析: 原来是一个DAG,考虑如何构造树形图,显然可以给每个点找一个父节点,所以树形图的个数就是$\prod\limits_u deg[u]$. 那么加 ...

  6. 【BZOJ】4011: [HNOI2015]落忆枫音

    题目链接:http://blog.csdn.net/popoqqq/article/details/45194103 写代码的时候也没有很清晰....具体看这里吧 #include<iostre ...

  7. bzoj4011[HNOI2015]落忆枫音 dp+容斥(?)

    4011: [HNOI2015]落忆枫音 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1125  Solved: 603[Submit][Statu ...

  8. [HNOI2015]落忆枫音 解题报告

    [HNOI2015]落忆枫音 设每个点入度是\(d_i\),如果不加边,答案是 \[ \prod_{i=2}^nd_i \] 意思是我们给每个点选一个父亲 然后我们加了一条边,最后如果还这么统计,那么 ...

  9. BZOJ4011: [HNOI2015]落忆枫音

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...

  10. [HNOI2015]落忆枫音

    题目描述 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂......我们也不可能再 ...

随机推荐

  1. Egret Wing4.1.0 断点调试

    一  双击代码行号左侧打断点 二 选择调试视图工具栏. 三  点击开始调试 1 wing内置播放器调试 选择此项进行调试会打开Egret内置播放器,我这里这个版本该选项无法进行断点... 2 使用本机 ...

  2. 关于wcf三大工具的使用(wsdl.exe svcutil.exe disco.exe)

    首先,我们必须创建一个wcf服务.并部署到IIS中.这里我已经将一个StudentService服务部署到我自己的电脑了. (1)svcutil.exe svcutil.exe工具的作用是通过服务地址 ...

  3. 【BZOJ3312】[Usaco2013 Nov]No Change 状压DP+二分

    [BZOJ3312][Usaco2013 Nov]No Change Description Farmer John is at the market to purchase supplies for ...

  4. 从SVN一键对比版本

    公司的部署程序太多,每次部署安装完后,还得从SVN上对比版本,手工做实在太麻烦. 比如下面的一个版本 思路: 将需要检查的部件及安装的位置.SVN相关信息写入配置文件,然后程序读取配置文件 配置文件内 ...

  5. IDEA 配置

    配置sublime主题: 击链接 http://www.riaway.com,选择并下载自己喜欢的主题 file -->import setting  到刚刚下载的主题jar包,之后导入,重起i ...

  6. Centos6.8 防火墙设置

    1.指令 vi /etc/sysconfig/iptables 添加以下内容和要开放的端口 # Firewall configuration written by system-config-fire ...

  7. 设计模式之——visitor模式

    visitor模式,又叫访问者模式,把结构和数据分开,编写一个访问者,去访问数据结构中的元素,然后把对各元素的处理全部交给访问者类.这样,当需要增加新的处理时候,只需要编写新的 访问者类,让数据结构可 ...

  8. 关于mysql5.7的一些变化

    最近接了个项目,使用的数据库是5.7的,开始没太在意,但是在接手的过程中发送了些小插曲,特意记录下来. 首先,我想自己安装个noinstall版本的,结果发信下载下来的和之前版本的不一样,没有data ...

  9. go-006-运算符

    运算符用于在程序运行时执行数学或逻辑运算. Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 算术运算符 下表列出了所有Go语言的算术运算符.假定 A ...

  10. LockSupport HotSpot里park/unpark的实现

    每个java线程都有一个Parker实例,Parker类是这样定义的: class Parker : public os::PlatformParker { private: volatile int ...