前言

我什么都不会,菜的被关了起来。

有标号的DAG图I

Solution

考虑递推,设\(f_i\)表示i个点的答案,显然这个东西是可以组合数+容斥递推?

设\(f_i\)表示i个点的答案,我们考虑假设现在有j个点入度为1,那么可以选出的点就是一个组合数\(C_i^j\),边的可能性有两种,对应的就是\(2^{j*(i-j)}\),然后接着搞,肯定这样子算会有重复的,所以容斥一下然后和以前的答案乘起来就好了。

\(f_i=\sum_{j=1}^{i}f_{i-j}*-1^{j-1}*C_i^j*2^{j*(i-j)}\)

然后就可以递推了。

上面虽然不是瞎扯,但是完全过不了本题 90分了解一下

所以需要运用的是什么?

当然是预处理啊(辣鸡出题人卡常数)

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi(){
    int f=1,sum=0;char ch=getchar();
    while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    return f*sum;
}
const int Mod=1e4+7;
int c[5010][5010],f[5010],two[25000010];
int main(){
    re int n=gi();two[0]=1;
    for(int i=1;i<=n*n/4;i++){
        two[i]=two[i-1]<<1;
        if(two[i]>=Mod)two[i]-=Mod;
    }
    c[0][0]=1;
    for(re int i=1;i<=n;i++){
        c[i][0]=1;
        for(re int j=1;j<=n;j++){
            c[i][j]=(c[i-1][j]+c[i-1][j-1]);
            if(c[i][j]>=Mod)c[i][j]-=Mod;
        }
    }
    f[0]=f[1]=1;
    for(re int i=2;i<=n;i++)
        for(re int j=1,d=1;j<=i;j++,d=-d){
            f[i]+=(ll)(c[i][j]*f[i-j]%Mod*two[j*(i-j)]%Mod*d)%Mod;
            while(f[i]<0)f[i]+=Mod;
            while(f[i]>=Mod)f[i]-=Mod;
        }
    printf("%d\n",f[n]);
    return 0;
}

有标号的DAG图计数II

Solution

考虑上面的式子怎么搞?

发现如果想要卷积优化肯定只能够把2的次方拆开啊。
\[
j*(i-j)=i*j-j^2
\\
=\frac{i^2}{2}-\frac{j^2}{2}-\frac{(i-j)^2}{2}
\]

化成这个形式直接二次剩余随便搞就好了。

P.S:如果不会多项式求逆就看这个

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
const int N=300010,Mod=998244353,REM=882049182;
int r[N],c[N],F[N],G[N],inv[N],jc[N],jcn[N];
int qpow(int a,int b){int ret=1;while(b){if(b&1)ret=(ll)ret*a%Mod;a=(ll)a*a%Mod;b>>=1;};return ret;}
inline int gi(){
    int f=1,sum=0;char ch=getchar();
    while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    return f*sum;
}
void NTT(int *P,int opt,int limit){
    for(int i=0;i<limit;i++)if(i<r[i])swap(P[i],P[r[i]]);
    for(int i=1;i<limit;i<<=1){
        int w=qpow(3,(Mod-1)/(i<<1));
        for(int p=i<<1,j=0;j<limit;j+=p){
            int W=1;
            for(int k=0;k<i;k++,W=(1ll*W*w)%Mod){
                int X=P[j+k],Y=(ll)P[i+j+k]*W%Mod;
                P[j+k]=(X+Y)%Mod;P[i+j+k]=(X-Y+Mod)%Mod;
            }
        }
    }
    if(opt==-1){
        reverse(P+1,P+limit);
        for(int i=0,inv=qpow(limit,Mod-2);i<limit;i++)P[i]=1ll*P[i]*inv%Mod;
    }
}
void Inv(int *a,int *b,int len){
    if(len==1){b[0]=qpow(a[0],Mod-2);return;}
    Inv(a,b,(len+1)>>1);
    int l=0,limit=1;
    while(limit<(len<<1))limit<<=1,l++;
    for(int i=0;i<limit;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
    for(int i=0;i<limit;i++)c[i]=a[i];
    for(int i=len;i<limit;i++)c[i]=0;
    NTT(c,1,limit);NTT(b,1,limit);
    for(int i=0;i<limit;i++)b[i]=1ll*(2-1ll*c[i]*b[i]%Mod+Mod)%Mod*b[i]%Mod;
    NTT(b,-1,limit);
    for(int i=len;i<limit;i++)b[i]=0;
}
int main(){
    int n=gi();
    jc[0]=jcn[0]=inv[1]=1;
    for(int i=1;i<=n;i++)jc[i]=(ll)jc[i-1]*i%Mod;
    for(int i=2;i<=n;i++)inv[i]=(ll)(Mod-Mod/i)*inv[Mod%i]%Mod;
    for(int i=1;i<=n;i++)jcn[i]=(ll)jcn[i-1]*inv[i]%Mod;
    G[0]=1;
    int Limit=1;while(Limit<=n)Limit<<=1;int t=qpow(REM,Mod-2);
    for(int i=1;i<Limit;i++)G[i]=1ll*jcn[i]*qpow(t,1ll*i*i%(Mod-1))%Mod;
    for(int i=1;i<Limit;i++)if(i&1)G[i]=Mod-G[i];
    Inv(G,F,Limit);
    printf("%lld\n",1ll*F[n]*jc[n]%Mod*qpow(REM,1ll*n*n%(Mod-1))%Mod);
    return 0;
}

有标号的DAG图计数1~4的更多相关文章

  1. 【合集】有标号的DAG图计数(合集)

    [合集]有标号的DAG图计数(合集) orz 1tst [题解]有标号的DAG计数1 [题解]有标号的DAG计数2 [题解]有标号的DAG计数3 [题解]有标号的DAG计数4

  2. COGS 有标号的DAG/强连通图计数

    COGS索引 一堆神仙容斥+多项式-- 有标号的DAG计数 I 考虑\(O(n^2)\)做法:设\(f_i\)表示总共有\(i\)个点的DAG数量,转移考虑枚举DAG上所有出度为\(0\)的点,剩下的 ...

  3. 有标号的DAG计数(FFT)

    有标号的DAG计数系列 有标号的DAG计数I 题意 给定一正整数\(n\),对\(n\)个点有标号的有向无环图(可以不连通)进行计数,输出答案\(mod \ 10007\)的结果.\(n\le 500 ...

  4. COGS2356 【HZOI2015】有标号的DAG计数 IV

    题面 题目描述 给定一正整数n,对n个点有标号的有向无环图进行计数. 这里加一个限制:此图必须是弱连通图. 输出答案mod 998244353的结果 输入格式 一个正整数n. 输出格式 一个数,表示答 ...

  5. COGS2355 【HZOI2015】 有标号的DAG计数 II

    题面 题目描述 给定一正整数n,对n个点有标号的有向无环图(可以不连通)进行计数,输出答案mod 998244353的结果 输入格式 一个正整数n 输出格式 一个数,表示答案 样例输入 3 样例输出 ...

  6. COGS2353 【HZOI2015】有标号的DAG计数 I

    题面 题目描述 给定一正整数n,对n个点有标号的有向无环图(可以不连通)进行计数,输出答案mod 10007的结果 输入格式 一个正整数n 输出格式 一个数,表示答案 样例输入 3 样例输出 25 提 ...

  7. 【题解】有标号的DAG计数1

    [HZOI 2015] 有标号的DAG计数 I 设\(f_i\)为\(i\)个点时的DAG图,(不必联通) 考虑如何转移,由于一个DAG必然有至少一个出度为\(0\)的点,所以我们钦定多少个出度为\( ...

  8. 【题解】有标号的DAG计数4

    [HZOI 2015] 有标号的DAG计数 IV 我们已经知道了\(f_i\)表示不一定需要联通的\(i\)节点的dag方案,考虑合并 参考[题解]P4841 城市规划(指数型母函数+多项式Ln),然 ...

  9. 【题解】有标号的DAG计数3

    [HZOI 2015] 有标号的DAG计数 III 我们已经知道了\(f_i\)表示不一定需要联通的\(i\)节点的dag方案,考虑合并 参考[题解]P4841 城市规划(指数型母函数+多项式Ln), ...

随机推荐

  1. mybatis3.2初学感悟

    新手,学了mybatis框架一周,写点感悟下来. mybatis,是操作数据库,持久层的一个框架,它是对JDBC的封装.看到了这个框架,我突然感受到封装与抽象的力量.也明白了些为什么要分层的原因. 记 ...

  2. User_Agent大全

    'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Ver ...

  3. viewer.js使用

    viewer GitHub 地址: JS 版本:https://github.com/fengyuanchen/viewerjs jQuery 版本:https://github.com/fengyu ...

  4. 数组方法indexOf & lastIndexOf

    indexOf() 语法:arrayObject.indexOf(searchvalue, startIndex) 功能:从数组的开头(位置0)开始向后查找. 参数:searchvalue:必需,要查 ...

  5. BP神经网络的参数改进参考?

    参考文献:黄巧巧. 基于BP神经网络的手写数字识别系统研究[D].华中师范大学,2009.  47-52 BP神经网络的缺陷:收敛速度慢和局部极小点的问题 使用的改进方案有 1. 学习速率(learn ...

  6. 2019.01.08 bzoj3809: Gty的二逼妹子序列(莫队+权值分块)

    传送门 题意:多组询问,问区间[l,r]中权值在[a,b]间的数的种类数. 看了一眼大家应该都知道要莫队了吧. 然后很容易想到用树状数组优化修改和查询做到O(mnlogamax)O(m\sqrt nl ...

  7. 2018.10.29 洛谷P4129 [SHOI2006]仙人掌(仙人掌+高精度)

    传送门 显然求出每一个环的大小. Ans=∏i(siz[i]+1)Ans=\prod_i(siz[i]+1)Ans=∏i​(siz[i]+1) 注意用高精度存答案. 代码: #include<b ...

  8. poj-1328(贪心+思维)

    题目链接:传送门 思路:找最少有几个点,先求出每个点的覆盖范围,就是一个点最大可以到达的地方是y相同的地方而且直线距离是d, 所以x范围在[x-sqrt(d*d-y*y),x+sqrt(d*d-y*y ...

  9. c++关键字static的作用

    1.隐藏 当同时编译多个源文件(.cpp)时,在某一个源文件中用static修饰的全局变量或函数,对其他源文件是隐藏的 //1.cpp ; void fun() { cout << < ...

  10. dj django与ajax交互

    Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输的数 ...