bzoj

BZOJ 3684 大朋友和多叉树

懵懂的女人 提交于 2020-04-08 05:01:08
BZOJ 3684 大朋友和多叉树 Description 我们的大朋友很喜欢计算机科学,而且尤其喜欢多叉树。对于一棵带有正整数点权的有根多叉树,如果它满足这样的性质,我们的大朋友就会将其称作神犇的:点权为1的结点是叶子结点;对于任一点权大于1的结点u,u的孩子数目deg[u]属于集合D,且u的点权等于这些孩子结点的点权之和。 给出一个整数s,你能求出根节点权值为s的神犇多叉树的个数吗?请参照样例以更好的理解什么样的两棵多叉树会被视为不同的。 我们只需要知道答案关于 \(950009857\) ( \(453*2^{21}+1\) ,一个质数)取模后的值。 Input 第一行有 \(2\) 个整数 \(s,m\) 。 第二行有 \(m\) 个互异的整数, \(d[1],d[2],…,d[m]\) ,为集合 \(D\) 中的元素。 Output 输出一行仅一个整数,表示答案模 \(950009857\) 的值。 Sample Input 4 2 2 3 Sample Output 10 前置知识 : \(\text{Lagrange}\) 反演(金策的论文中有讲): 若两个没有常数项的函数 \(f(x)\) 和 \(g(x)\) 满足: \[f(g(x))=x \] (也称这两个函数互为复合逆。) 我们就有: \[[x^n]g(x)=\frac{1}{n}[w^{n-1}](

bzoj 2929 [Poi1999]洞穴攀行

怎甘沉沦 提交于 2020-04-07 11:31:36
LINK: 洞穴攀行 题目有鬼了。。 注意理解时间的含义 并非同一时刻而是指某次训练。 所以可以发现是最大流。 //#include<bits\stdc++.h> #include<iostream> #include<iomanip> #include<cstdio> #include<cstring> #include<string> #include<ctime> #include<cmath> #include<cctype> #include<cstdlib> #include<queue> #include<deque> #include<stack> #include<vector> #include<algorithm> #include<utility> #include<bitset> #include<set> #include<map> #define ll long long #define db double #define INF 1000000000 #define ldb long double #define pb push_back #define get(x) x=read() #define gt(x) scanf("%d",&x) #define put(x) printf("%d\n",x) #define putl(x) printf

bzoj 3653 [湖南集训]谈笑风生

送分小仙女□ 提交于 2020-04-07 05:02:24
题目描述 设 T 为一棵有根树,我们做如下的定义: • 设 a 和 b 为 T 中的两个不同节点。如果 a 是 b 的祖先,那么称“a 比 b 不知道高明到哪里去了”。 • 设 a 和 b 为 T 中的两个不同节点。如果 a 与 b 在树上的距离不超过某个给定常数 x,那么称“a 与 b 谈笑风生”。 给定一棵 n 个节点的有根树 T,节点的编号为 1 ∼ n,根节点为 1 号节点。你需要回答 q 个询问,询问给定两个整数 p 和 k,问有多少个有序三元组 (a; b; c) 满足: a、 b 和 c 为 T 中三个不同的点,且 a 为 p 号节点; a 和 b 都比 c 不知道高明到哪里去了; a 和 b 谈笑风生。这里谈笑风生中的常数为给定的 k。 输入输出格式 输入格式: 输入文件的第一行含有两个正整数 n 和 q,分别代表有根树的点数与询问的个数。 接下来 n − 1 行,每行描述一条树上的边。每行含有两个整数 u 和 v,代表在节点 u 和 v 之间有一条边。 接下来 q 行,每行描述一个操作。第 i 行含有两个整数,分别表示第 i 个询问的 p 和 k。 输出格式: 输出 q 行,每行对应一个询问,代表询问的答案。 输入输出样例 输入样例#1: 5 3 1 2 1 3 2 4 4 5 2 2 4 1 2 3 输出样例#1: 3 1 3 说明 样例中的树如下图所示:

BZOJ 1406 - 伪数论

你说的曾经没有我的故事 提交于 2020-04-06 10:40:59
本来以为用一些奇妙的枚举顺序可以直接卡过去,然后弃疗。。 由题意可得 x^2 = 1 (mod n) ==> x^2 = k*n+1 ==> (x+1)(x-1) = k*n ==> n | (x+1)(x-1) 然后枚举n的约数。设n=a*b (a<b),若枚举a,就可求出b。然后令 a | (x+1),b | (x-1)。枚举可以被b整除的数(因为b>a),再判断它+2是否能被a整除。反过来再判断一次。如果(x+1)和(x-1)分别获得a、b中的因子,那么一定也会被其他情况枚举到,即做到了不重不漏。 代码中也有很多小坑。。 // BZOJ 1406 #include <cstdio> #include <cstring> #include <set> #include <algorithm> using namespace std; #define rep(i,a,b) for (int i=a; i<=b; i++) #define dep(i,a,b) for (int i=a; i>=b; i--) #define read(x) scanf("%d", &x) #define fill(a,x) memset(a, x, sizeof(a)) int n; set<int> S; int main() { read(n); int s=0; for (int i=1;

bzoj 2694: Lcm

淺唱寂寞╮ 提交于 2020-03-25 23:43:05
LINK: LCM T组数据, \(T\leq 10000\) \(A,B\leq 4000000\) 简述一下这道题的式子:A,B用n,m来代替 \(\sum_{i=1}{n}\sum_{j=1}^{m}\mu((i,j))^2LCM(i,j)\) 我们可以简单推式子 推出: \(\sum_{w=1}^{n}w\cdot S(\frac{m}{w})\cdot S(\frac{n}{w})\cdot\sum_{x|w}x\cdot\mu(x)\mu(\frac{w}{x})^2\) 其中S(x)表示 \(\sum_{i=1}^xi\) 我们发现预处理后面的前缀和即可。 由于A B 最大4e6 这显然是在卡nlnn的算法 我们考虑线性筛出后面的东西。 设f(w)表示 \(\sum_{x|w}x\cdot\mu(x)\mu(\frac{w}{x})^2\) 那么f(w)其实是一个积性函数。 考虑 当w里存在p的时候 怎么筛 由于f(p^3)为0 p的更高次项也为0 那么f(p)=1-p,f(p^2)直接由f(p)*f(p)类似的式子计算即可。 这算是一个小trick吧 当w存在p的时候 我们还是可以通过除以p来获取互质 从而利用积性函数的性质来求答案。 由于答案对 \(2^30\) 取模 但是我们可以开unint 对 \(2^32\) 取模 最后 拿出后面的30位数即可。 const

BZOJ 4421: [Cerc2015] Digit Division

倾然丶 夕夏残阳落幕 提交于 2020-03-15 09:23:51
4421: [Cerc2015] Digit Division Time Limit: 1 Sec Memory Limit: 512 MB Submit: 348 Solved: 202 [ Submit ][ Status ][ Discuss ] Description 给出一个数字串,现将其分成一个或多个子串,要求分出来的每个子串能Mod M等于0. 将方案数(mod 10^9+7) Input 给出N,M,其中1<=N<=300 000,1<=M<=1000 000. 接下来一行,一个数字串,长度为N。 Output 如题 Sample Input 4 2 1246 Sample Output 4 HINT Source [ Submit ][ Status ][ Discuss ] 只需要求出所有能使得前缀数字串在mod意义下等于0的位置,设为$t$,则从这些位置任意切开,得到的串均满足要求。每个位置有两种选项(切或不切)答案是$2^{t}$。 1 #include <cstdio> 2 3 const int mod = 1e9 + 7; 4 5 int n, m, t; 6 char s[300005]; 7 8 inline int pow(long long a, int b) 9 { 10 long long r = 1; 11 12 while (b) 13

BZOJ 3027 [Ceoi2004]Sweet

孤街浪徒 提交于 2020-03-10 15:22:19
BZOJ 3027 [Ceoi2004]Sweet 生成函数 题解: 求出 <= b 的答案减去 <=a-1 的答案 先写出每个物品的生成函数 \((1+x+x^{2}+x^{3} \cdots)=\frac{1-x^{m_{i}+1}}{1-x}\) 然后把他们乘起来 \(\prod_{i=1}^{n}\frac{1-x^{m_{i}+1}}{1-x}\) \(=(1+x+x^{2}+x^{3}+\cdots)^{n}\prod_{i=1}^{n}(1-x^{m_{i}+1})\) 然后暴力展开后面的式子,最多有 \(2^{n}\) 项 对于前面的式子, \(x^{i}\) 这一项的系数由隔板法得到为 \(C_{i+n-1}^{n-1}\) 对于后面的 \(k \times 2^{y}\) 项,他对答案的贡献是 \(k \times (C_{n-1}^{n-1}+C_{1+n-1}^{n-1}+C_{2+n-1}^{n-1}+ \cdots +C_{a-y+n-1}^{n-1})\) 然后发现这其实是杨辉三角的一列,然后式子化成 \(=k \times C_{a-y+n}^{n}\) 模数不是质数所以可能没有逆元 \(C_{a-y+n}^{n}=\frac{(a-y+n)!}{n!(a-y)!}=\frac{(a-y+n)^{\underline{n}}}{n!}\)

BZOJ 1878 HH的项链

ぃ、小莉子 提交于 2020-03-04 04:30:33
莫队 还是一道模板。。不过洛谷数据加强了,必须要奇偶性排序+吸氧才能过,BZOJ可以直接过的~ #include <bits/stdc++.h> #define INF 0x3f3f3f3f #define full(a, b) memset(a, b, sizeof a) using namespace std; typedef long long ll; inline int lowbit(int x){ return x & (-x); } inline int read(){ int X = 0, w = 0; char ch = 0; while(!isdigit(ch)) { w |= ch == '-'; ch = getchar(); } while(isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar(); return w ? -X : X; } inline int gcd(int a, int b){ return b ? gcd(b, a % b) : a; } inline int lcm(int a, int b){ return a / gcd(a, b) * b; } template<typename T> inline T max(T x, T y, T z){

[BZOJ 2820]YY的GCD

空扰寡人 提交于 2020-03-01 12:24:38
Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于是向你来请教…… 多组输入 Input 第一行一个整数T 表述数据组数 接下来T行,每行两个正整数,表示N, M Output T行,每行一个整数表示第i组数据的结果 Sample Input 2 10 10 100 100 Sample Output 30 2791 HINT T = 10000 N, M <= 10000000 题解 由之前的 [HAOI 2011]Problem b : 令 $F(d)$ 为 $d\mid gcd(i,j)$ 的数对 $(i,j)$ 个数, $f(d)$ 为 $d=gcd(i,j)$ 的数对 $(i,j)$ 个数。 由题 $$F(k)=\sum_{d=1}^{min\left\{\left\lfloor\frac{a}{k}\right\rfloor,\left\lfloor\frac{b}{k} \right\rfloor\right\}}f(kd)$$ 由莫比乌斯反演定理 $F(n)=\sum_{n\mid d} f(d)\Rightarrow f(n)=\sum_{n\mid d} \mu(\frac{d}{n})F(d)$ \begin

BZOJ 2038 小Z的袜子

血红的双手。 提交于 2020-02-27 09:56:41
莫队 基本上没什么变化,推一下公式就可以了 #include <bits/stdc++.h> #define INF 0x3f3f3f3f #define full(a, b) memset(a, b, sizeof a) using namespace std; typedef long long ll; inline int lowbit(int x){ return x & (-x); } inline int read(){ int X = 0, w = 0; char ch = 0; while(!isdigit(ch)) { w |= ch == '-'; ch = getchar(); } while(isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar(); return w ? -X : X; } inline ll gcd(ll a, ll b){ return b ? gcd(b, a % b) : a; } inline ll lcm(ll a, ll b){ return a / gcd(a, b) * b; } template<typename T> inline T max(T x, T y, T z){ return max(max(x, y), z); } template