[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2111 [题意] 给定n,问1..n的排列中有多少个可以构成小根堆. [思路] 设f[i]为i个数的方案,设l为左子树大小r为右子树大小,则有: f[i]=C(i-1,l)*f[l]*f[r] 因为是个堆,所以子树大小都是确定的,可以直接递推得到. 其中C(n,m) nm比较大,可以用lucas定理求. 模型建立的重要性可知一二... [代码] #include<cstdio> #i…
bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: using namespace std; 3: const int N = 1e6+5; 4: typedef long long LL; 5: LL m, p, T, x, y, F[N]; 6: LL n, size[N<<1]; 7: LL f[N]; 8: LL inv(LL t, LL…
2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1936  Solved: 477[Submit][Status][Discuss] Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值 Input 输入文件的第一行包含两个…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意: 给定n,p,问你有多少个1到n的排列P,对于任意整数i∈[2,n]满足P[i]>P[i/2]. 保证p为质数,输出答案 mod p的值.(n <= 10^6, p <= 10^9) 题解: 对于每个i,分别向i*2和i*2+1连一条边. 可以发现,最终形成的是一棵以1为根节点的二叉树. 题目中P[i]>P[i/2]的条件,就变成了:P[fa]<P[son…
是我想复杂了 首先发现大于关系构成了一棵二叉树的结构,于是树形dp 设f[i]为i点的方案数,si[i]为i点的子树大小,递推式是\( f[i]=f[i*2]*f[i*2+1]*C_{si[i]-1}^{si[i*2]} \) 组合数用Lucas求 #include<iostream> #include<cstdio> using namespace std; long long n,p,f[5000005],jc[5000005],s[5000005]; long long ks…
题意:称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模 P以后的值 题解:有一步特别神得转化:由于对于序列中的元素 $p[i]$ 只限制 $p[i]>p[i/2]$ ,所以可以对原序列构建一个小根堆 对于序列中的 $i$,其在小根堆的父亲是 $\frac{i}{2}$. 那么,我们就将原问题转换为:给定一颗形态固定的小根堆,在小根堆上填上数字,问…
神题... 扒自某神犇题解: http://blog.csdn.net/aarongzk/article/details/50655471 #include<bits/stdc++.h> #define LL long long using namespace std; inline LL ra() { LL x=; char ch=getchar(); ') ch=getchar(); +ch-'; ch=getchar();} return x; } ; LL n,mod,f[maxn],…
2111: [ZJOI2010]Perm 排列计数 链接 题意: 称一个1,2,...,N的排列$P_1,P_2...,P_n$是Magic的,当且仅当$2<=i<=N$时,$P_i>P_{i/2}$. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值 虽然是中文题,但是想加上markdown. 思路: 好题! lucas定理+dp. 题目要求大小为n的小根堆的方案数,(即给定的二叉树的父节点大于子节点). f[i] 表示以i为根的子树的方案数.siz…
[题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数. [算法]计数DP+排列组合+lucas [题解]令i的父亲为i/2,转化为要求给一棵n个点的完全二叉树编号使得儿子编号>父亲编号. 设\(f[i]\)表示以第i个点为根的子树的编号方案数(1~sz[i]的排列),考虑从两个儿子处转移. 排列的本质是大小关系,所以两个排列组合起来相当于对1~sz[i&…
[BZOJ2111][ZJOI2010]Perm 排列计数 Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值 Input 输入文件的第一行包含两个整数 n和p,含义如上所述. Output 输出文件中仅包含一个整数,表示计算1,2,⋯,的排列中, Magic排列的个数模 p的值. Sample Input 20 23…
题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Mogic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Mogic的,答案可能很大,只能输出模P以后的值 输入 输入文件的第一行包含两个整数 n和p,含义如上所述. 输出 输出文件中仅包含一个整数,表示计算1,2,⋯, n的排列中, Mogic排列的个数模 p的值. 样例输入 20 23 样例输出 16 题解 dp+Lucas定理 题目显然小根堆,考虑怎么求以一个节点为根的方案数.根肯定…
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意:一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值 题解:注意到形成一个树状结构,如果不妨设f[i]为i所在子树分配s[i]个节点的方案数. 那么有递推式:f[i]=f[i<<1]*f[i<<1|1]*c(…
题目传送门 题目描述 称一个1,2,...,N的排列${P}_{1}$,${P}_{2}$,...,${P}_{N}$是Magic的,当且仅当2≤i≤N时,${P}_{i}$>${P}_{\frac{i}{2}}$.计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值. 输入格式 输入文件的第一行包含两个整数n和p,含义如上所述. 输出格式 输出文件中仅包含一个整数,表示计算1,2,⋯, N的排列中, Magic排列的个数模p的值. 样例 样例输入: 20 23…
Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值 Input 输入文件的第一行包含两个整数 n和p,含义如上所述. Output 输出文件中仅包含一个整数,表示计算1,2,⋯, ���的排列中, Magic排列的个数模 p的值. Sample Input 20 23 Sample Output 16 HINT 100%…
题目大意 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值. 题解 1) 问题转换,建立模型. 可以发现,本题就是要求小根完全二叉树的个数. 2) 树上dp 定义f[n]为以n为根的完全二叉树个数. 根据乘法原理, f[n] = f[i<<1] * f[i<<1|1] * C(s[i]-1, i << 1)…
题意就是求一个n个点的堆的合法形态数. 显然,给定堆中所有数的集合,则这个堆的根是确定的,而由于堆是完全二叉树,所以每个点左右子树的大小也是确定的. 设以i为根的堆的形态数为F(i),所以F(i)+=F(sz[2*i])*F(sz[2*i+1])*C(sz[i]-1,sz[2*i]).直接DP即可. 有个令人无语的坑,n可能大于p,要用Lucas. 还有求阶乘逆元的时候根本不需要用快速幂算出fac[n]的逆元再逆推回去,直接跟阶乘一样顺推就好了. #include<cstdio> #inclu…
题目大意:求[a,b]间全部的整数中0~9每一个数字出现了几次 令f[i]为i位数(算前导零)中每一个数出现的次数(一定是同样的,所以仅仅记录一个即可了) 有f[i]=f[i-1]*10+10^(i-1) 然后照例十进制拆分 当中计算[0,999...9]的时候要从1~9枚举最高位,然后其余位调用f[i-1]就可以 剩余部分已知位直接乘,未知位调用f[i] #include<cstdio> #include<cstring> #include<iostream> #in…
B. Perm 排列计数 内存限制:512 MiB 时间限制:1000 ms 标准输入输出   题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值 输入格式 输入文件的第一行包含两个整数 n和p,含义如上所述. 输出格式 输出文件中仅包含一个整数,表示计算1,2,?, ???的排列中, Magic排列的个数模 p的值. 样例 样例输入…
题目链接 对于\(a_i>a_{i/2}\),我们能想到小根堆.题意就是,求构成大小为\(n\)的小根堆有多少种方案. 考虑DP,\(f[i]\)表示构成大小为\(i\)的小根堆的方案数,那么如果我们确定左右子树\(size\),则左右子树又分别是一个子问题. 那么可以得到转移方程:\(f[i]=C_{i-1}^l*f[l]*f[r]\). 因为是按顺序填满二叉树的每一层,所以左子树大小是确定的啊. \(P\)给定,可能\(\leq n\),所以要用Lucas定理求组合数. //12540kb…
dp(i, j, k)表示共i位, 最高位是j, 数字k出现次数. 预处理出来. 差分答案, 对于0~x的答案, 从低位到高位进行讨论 ------------------------------------------------------------------------------ #include<bits/stdc++.h>   using namespace std;   typedef long long ll;   const int maxn = 16; const in…
传送门 如果能够根据题意看出这是一个堆的话,那么就有些思路了.. 首先堆顶必须是最小元素,然后左右儿子可以预处理出来都有多少个数, 把剩余的数任意分配给两个儿子,用排列组合即可 dp(now) = dp(now << 1) * dp(now << 1 | 1) * C(sum[now] - 1, sum[now << 1]) #include <cstdio> #define N 5000001 #define LL long long int n; LL…
题意:称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值. 解法:我们仔细观察这个pi>=pi/2,想到什么了?像不像二叉树中每个点i和它的两个儿子的编号2i和2i+1. 那么我们可以想象每个点i想它的两个儿子2i/2i+1连边,加上Pi>Pi/2这个条件,那么这棵二叉树就是一棵小根堆.那么我们考虑用dp解决这道题, 设dp[i]表…
BZOJ4517 Sdoi2016 排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第一行一个数 T,表示有 T 组数据. 接下来 T 行,每行两个整数 n.m. T=500000,n≤1000000,m≤1000000 Output 输出 T 行,每行一个数,…
1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义f[i][j][k]表示若前i个位置有k个j的此时的全局方案数,然后就可以记忆化搜索了(具体看代码吧) 代码: #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #inclu…
题干: Description称一个1,2,…,N的排列P1,P2…,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,…N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值Input输入文件的第一行包含两个整数 n和p,含义如上所述.Output输出文件中仅包含一个整数,表示计算1,2,⋯, n的排列中, Magic排列的个数模 p的值.Sample Input20 23Sample Output16HINT100%的数据中,1 ≤ N ≤ 10…
题面 传送门 思路 一句话题意: 给出一个长度为 n 的序列,求所有长度大于等于2的子序列个数,满足:对于子序列中任意两个相邻的数 a和 b (b 在 a 前面),$C_a^b mod 2=1$,答案对1e9+7取模 显然膜2余1是个非常特殊的性质,应当好好加以利用 和组合数取模有关的东西,有Lucas定理,因此我们来试着推一推 $C_n^m%2=C_{n%2}^{m%2}\ast C_{n/2}^{m/2}$ 这个玩意的意义,显然就是把n和m转成二进制,那么只要没有某一位上n是0m是1(此时$…
Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值 Input 输入文件的第一行包含两个整数 n和p,含义如上所述. Output 输出文件中仅包含一个整数,表示计算1,2,⋯, ���的排列中, Magic排列的个数模 p的值. Sample Input 20 23 Sample Output 16 HINT 100%…
题目链接:BZOJ - 1833 题目分析 数位DP .. 用 f[i][j][k] 表示第 i 位是 j 的 i 位数共有多少个数码 k . 然后差分询问...Get()中注意一下,如果固定了第 i 位,这一位是 t ,那么数码 t 的答案是要加一个值的(见代码). 代码 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <cmat…
题意 题目链接 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值 Sol 这辈子做不出的计数系列. 一眼小根堆没啥好说的.最关键的一点是:树的形态是可以递推出来的. 那么当前点$i$为根节点,大小为$siz[i]$,左/右儿子分别为$ls, rs$ 那么$f[i] = C_{siz[i] - 1}^{siz[ls]} f[ls] \times…
非典型数位dp 先预处理出f[i][j][k]表示从后往前第i位为j时k的个数,然后把答案转换为ans(r)-ans(l-1),用预处理出的f数组dp出f即可(可能也不是dp吧--) #include<iostream> #include<cstdio> using namespace std; long long l,r,t[25]; struct dp { long long a[15]; dp operator + (dp x) { dp r; for(int i=0;i&l…