BZOJ 3456 NTT图的计数 容斥

思路:

RT

懒得写了

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=(1<<18)+5,mod=1004535809;
int tmp[N],R[N],fac[N],A[N],B[N],C[N],niB[N];
int pow(ll x,ll y){
    ll res=1;
    while(y){
        if(y&1)res=res*x%mod;
        x=x*x%mod,y>>=1;
    }return (int)res;
}
void NTT(int *a,int n,int f){
    int m=1,L=0;
    for(;m<n;m<<=1)L++;
    for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
    for(int i=0;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);
    for(int l=1;l<n;l<<=1){
        int wn=pow(3,((mod-1)/(l<<1)*f+mod-1)%(mod-1));
        for(int j=0;j<n;j+=(l<<1)){
            int w=1;
            for(int k=0;k<l;k++,w=1ll*w*wn%mod){
                int x=a[j+k],y=1ll*w*a[j+k+l]%mod;
                a[j+k]=(x+y)%mod,a[j+k+l]=(x-y+mod)%mod;
            }
        }
    }
    if(f==-1){
        int ni=pow(n,mod-2);
        for(int i=0;i<n;i++)a[i]=1ll*a[i]*ni%mod;
    }
}
void get_inv(int *a,int *b,int n){
    if(n==1){b[0]=pow(a[0],mod-2);return;}
    get_inv(a,b,n>>1);
    memcpy(tmp,a,sizeof(int)*n);memset(tmp+n,0,sizeof(int)*n);
    NTT(tmp,n<<1,1),NTT(b,n<<1,1);
    for(int i=0;i<n<<1;i++)tmp[i]=((1ll*b[i]*(2-1ll*tmp[i]*b[i]%mod))%mod+mod)%mod;
    NTT(tmp,n<<1,-1);
    memcpy(b,tmp,sizeof(int)*n);memset(b+n,0,sizeof(int)*n);
}
signed main(){
    int n,m,i;
    scanf("%d",&n);for(m=1;m<=n;m<<=1);
    for(fac[0]=1,i=1;i<=n;i++)fac[i]=1ll*fac[i-1]*i%mod;
    for(i=0;i<=n;i++)B[i]=1ll*pow(2,(1ll*i*(i-1)/2)%(mod-1))*pow(fac[i],mod-2)%mod;
    for(i=0;i<=n;i++)C[i]=1ll*pow(2,(1ll*i*(i-1)/2)%(mod-1))*pow(fac[i-1],mod-2)%mod;
    get_inv(B,niB,m),NTT(niB,m,1);NTT(C,m,1);
    for(int i=0;i<m;i++)A[i]=1ll*niB[i]*C[i]%mod;
    NTT(A,m,-1);
    printf("%lld\n",1ll*A[n]*fac[n-1]%mod);
}
时间: 2025-02-01 11:50:49

BZOJ 3456 NTT图的计数 容斥的相关文章

【BZOJ 3771】 3771: Triple (FFT+容斥)

3771: Triple Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 547  Solved: 307 Description 我们讲一个悲伤的故事. 从前有一个贫穷的樵夫在河边砍柴. 这时候河里出现了一个水神,夺过了他的斧头,说: "这把斧头,是不是你的?" 樵夫一看:"是啊是啊!" 水神把斧头扔在一边,又拿起一个东西问: "这把斧头,是不是你的?" 樵夫看不清楚,但又怕真的是自己的斧头,只好又

bzoj 2301 Problem b 莫比乌斯反演+容斥

题意:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数 思路:在hdu1695的基础上加上容斥,即:ans=solve(b/k,d/k)-solve((a-1)/k,d/k)-solve((c-1)/k,b/k)+solve((a-1)/k,(c-1)/k),详见代码: /********************************************************* file n

hdu5072 Coprime 2014鞍山现场赛C题 计数+容斥

http://acm.hdu.edu.cn/showproblem.php?pid=5072 Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 354    Accepted Submission(s): 154 Problem Description There are n people standing in a

BZOJ 2005 [Noi2010]能量採集 (容斥)

[Noi2010]能量採集 Time Limit: 10 Sec  Memory Limit: 552 MB Submit: 2324  Solved: 1387 [Submit][Status][Discuss] Description 栋栋有一块长方形的地.他在地上种了一种能量植物,这样的植物能够採集太阳光的能量.在这些植物採集能量后,栋栋再使用一个能量汇集机器把这些植物採集到的能量汇集到一起. 栋栋的植物种得很整齐.一共同拥有n列,每列有m棵,植物的横竖间距都一样,因此对于每一棵植物.栋栋

[日常训练]三视图(组合计数+容斥)

Description 给定两个长度为 \(n\) 的数组 \(a,b\). 要求给一个 \(n×n\) 的矩阵的每个位置填上一个非负整数,使得第 \(i\) 行的最大值为 \(a_i\),第 \(j\) 列的最大值为 \(b_j\). 求方案数对 \(998244353\) 取模的结果. \(1\leq n\leq 10^5\),\(1\leq a,b\leq 10^9\). Solution 显然可以把 \(a,b\) 分别降序排序,不影响结果. 记 \(c_{i,j}=min(a_i,b_

bzoj 4036 [HAOI2015]按位或——min-max容斥+FMT

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4036 题解:https://www.cnblogs.com/Zinn/p/10260126.html #include<cstdio> #include<cstring> #include<algorithm> #define db double using namespace std; const int N=25,M=(1<<20)+5; int

$bzoj2560$ 串珠子 容斥+$dp$

正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多少种方案可以连成一张联通图 显然考虑容斥呗?设$f_i$表示状态为$i$的点连成联通图的合法方案,$g_i$表示状态为$i$的点随便连边的所有方案 显然$g_i$可以先预处理出来?就等于$\prod_{u,v\in i}a_{u,v}$.然后$f_i$就等于$g_i$减去不合法的数量.不合法数量显然

bzoj 4671 异或图 —— 容斥+斯特林反演+线性基

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4671 首先,考虑容斥,就是设 \( t[i] \) 表示至少有 \( i \) 个连通块的方案数: 我们希望得到恰好有一个连通块的方案数,但这里不能直接 \( + t[1] - t[2] + t[3] - t[4] ... \),因为每个"恰好 \( i \) 个连通块"的情况并不是在各种 \( t[j] ( j<=i ) \) 中只被算了一次,而是因为标号,被算了 \(

【BZOJ 4455】 [Zjoi2016]小星星 容斥计数

dalao教导我们,看到计数想容斥……卡常策略:枚举顺序.除去无效状态.(树结构) #include <cstdio> #include <cstring> #include <algorithm> typedef long long LL; const int N=20; LL f[N][N]; int n,m,d[N][N],full; bool yeah[N]; int st[N],cnt; struct V{ int to,next; }c[N<<1