【ZOJ 3874】Permutation Graph

2024-06-05 11:08
文章标签 graph zoj permutation 3874

本文主要是介绍【ZOJ 3874】Permutation Graph,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

浙江省赛题。当时赛后听说是NTT+CDQ震惊了两个词一个都没有听说过。

现在突然想起来这个题,回来一看也并不是那么的不可做。比赛的时候还在打表找规律233~

首先可以想到,因为逆序对都要连一条边,因此所有的对于任意一个部分都是下表连续的,否则答案就为0。

若下表连续的,则可以想到答案只与长度有关。

不妨设dp[i]为长度为i的连续下表的方案数,则可以得到

dp[i] = i! - sigma(dp[i - k] * k!),其中 1<= k < i

简单解释一下就是说,若1-i连续,则必须全是在同一个块中

考虑不合法的情况,不妨设最后一个块为k个连续的数,则需要减去的方案为dp[i - k] * k!

后面是卷积,可以用ntt计算。

说起来NTT的模板还没有补,有空补。

再有如果直接一项一项地算也是n^2logn的复杂度爆炸。

因此用cdq分治来优化一下就好了。

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;#define lson l,mid
#define rson mid + 1,r
#define root 1,n
#define Mid int mid = (l + r) >> 1const int N = 1 << 18;
const int mod = 786433;
const int G = 10;int dp[N];
int fac[N];
int x1[N << 1],x2[N << 1],tmp[N << 1];
int tn;
int Pow(int a,int b){int res = 1;while(b){if(b & 1) res = 1ll * res * a % mod;a = 1ll * a * a % mod;b >>= 1;}return res;
}
int rev(int x){int res = 0;for(int i = 0 ; i < tn ; i ++){if(x & 1) res += 1 << tn - i - 1;x >>= 1;}return res;
}
void ntt(int A[],int n,int op){for(int i = 0 ; i < n ; i ++) tmp[ rev(i) ] = A[i];for(int i = 0 ; i < n ; i ++) A[i] = tmp[i];for(int i = 1 ; (1 << i) <= n ; i ++){int m = 1 << i;int wn;if(op == 1) wn = Pow(G,(mod - 1) / m);else wn = Pow(G,(mod - 1) - (mod - 1) / m);for(int k = 0 ; k < n ; k += m){int w = 1,u,t;for(int j = 0 ; j < m / 2 ; j ++){u = A[k + j];t = 1ll * w * A[k + j + m / 2] % mod;A[k + j] = (u + t) % mod;A[k + j + m / 2] = (u - t + mod) % mod;w = 1ll * w * wn % mod;}}}if(op == -1){int Inv = Pow(n,mod - 2);for(int i = 0 ; i < n ; i ++)A[i] = 1ll * A[i] * Inv % mod;}
}
void cdq(int l,int r){if(l > r) return;if(l == r){dp[l] = (dp[l] + fac[l]) % mod;return;}Mid;cdq(lson);int len = 1;tn = 0;while(len < (mid - l + 1) * 2)len <<= 1,tn ++;for(int i = l ; i <= mid ; i ++) x1[i - l] = dp[i];for(int i = mid - l + 1 ; i < len ; i ++) x1[i] = 0;for(int i = 0 ; i < len ; i ++) x2[i] = fac[i];ntt(x1,len,1);ntt(x2,len,1);for(int i = 0 ; i < len ; i ++)x1[i] = 1ll * x1[i] * x2[i] % mod;ntt(x1,len,-1);for(int i = mid + 1 ; i <= r ; i ++){dp[i] += (mod - x1[i - l]) % mod;dp[i] %= mod;}cdq(rson);
}
void init(){int n = 100002;fac[0] = 1;for(int i = 1 ; i <= n ; i ++)fac[i] = 1ll * fac[i - 1] * i % mod;cdq(root);
}
void solve(){int n,m;scanf("%d%d",&n,&m);int c,l,r,x;int ret = 1;for(int i = 1 ; i <= m ; i ++){l = n + 1,r = -1;scanf("%d",&c);for(int j = 0 ; j < c ; j ++){scanf("%d",&x);l = min(l,x);r = max(r,x);}ret = 1ll * ret * dp[c] % mod;if(r - l + 1 != c) ret = 0;}printf("%d\n",ret);
}
int main()
{init();int _;scanf("%d",&_);while(_--) solve();return 0;
}


这篇关于【ZOJ 3874】Permutation Graph的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032877

相关文章

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

zoj 4624

题目分析:有两排灯,每排n个,每个灯亮的概率为p,每个灯之间互不影响,亮了的灯不再灭,问两排中,每排有大于等于m个灯亮的概率。 设dp[ i ][ j ]为第一排亮了i个灯,第二排亮了j个灯,距离目标状态的期望天数。显然 i >= m ,j >= m时 , dp[ i ][ j ] = 0 。 状态转移 : 第一排亮了a个灯,a 在[ 0 , n - i] 之间,第二排亮了b个灯 , b 在

zoj 3228 ac自动机

给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 Sample Input ab 2 0 ab 1 ab abababac 2 0 aba 1 aba abcdefghijklmnopqrstuvwxyz 3 0 abc 1 def 1 jmn Sample Output Case 1 1 1 Case 2

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

图神经网络框架DGL实现Graph Attention Network (GAT)笔记

参考列表: [1]深入理解图注意力机制 [2]DGL官方学习教程一 ——基础操作&消息传递 [3]Cora数据集介绍+python读取 一、DGL实现GAT分类机器学习论文 程序摘自[1],该程序实现了利用图神经网络框架——DGL,实现图注意网络(GAT)。应用demo为对机器学习论文数据集——Cora,对论文所属类别进行分类。(下图摘自[3]) 1. 程序 Ubuntu:18.04

SIGMOD-24概览Part7: Industry Session (Graph Data Management)

👇BG3: A Cost Effective and I/O Efficient Graph Database in ByteDance 🏛机构:字节 ➡️领域: Information systems → Data management systemsStorage management 📚摘要:介绍了字节新提出的ByteGraph 3.0(BG3)模型,用来处理大规模图结构数据 背景

ZOJ 3324 Machine(线段树区间合并)

这道题网上很多代码是错误的,由于后台数据水,他们可以AC。 比如这组数据 10 3 p 0 9 r 0 5 r 6 9 输出应该是 0 1 1 所以有的人直接记录该区间是否被覆盖过的方法是错误的 正确方法应该是记录这段区间的最小高度(就是最接近初始位置的高度),和最小高度对应的最长左区间和右区间 开一个sum记录这段区间最小高度的块数,min_v 记录该区间最小高度 cover

A Comprehensive Survey on Graph Neural Networks笔记

一、摘要-Abstract 1、传统的深度学习模型主要处理欧几里得数据(如图像、文本),而图神经网络的出现和发展是为了有效处理和学习非欧几里得域(即图结构数据)的信息。 2、将GNN划分为四类:recurrent GNNs(RecGNN), convolutional GNNs,(GCN), graph autoencoders(GAE), and spatial–temporal GNNs(S

Neighborhood Homophily-based Graph Convolutional Network

#paper/ccfB 推荐指数: #paper/⭐ #pp/图结构学习 流程 重定义同配性指标: N H i k = ∣ N ( i , k , c m a x ) ∣ ∣ N ( i , k ) ∣ with c m a x = arg ⁡ max ⁡ c ∈ [ 1 , C ] ∣ N ( i , k , c ) ∣ NH_i^k=\frac{|\mathcal{N}(i,k,c_{