Recently, TeaTree acquire new knoledge gcd (Greatest Common Divisor), now she want to test you.
As we know, TeaTree is a tree and her root is node 1, she have n nodes and n-1 edge, for each node i, it has it’s value v[i].

For every two nodes i and j (i is not equal to j), they will tell
their Lowest Common Ancestors (LCA) a number : gcd(v[i],v[j]).

For each node, you have to calculate the max number that it heard. some definition:

In graph theory and computer science, the lowest common ancestor
(LCA) of two nodes u and v in a tree is the lowest (deepest) node that
has both u and v as descendants, where we define each node to be a
descendant of itself.
InputOn the first line, there is a positive integer n, which describe the number of nodes.

Next line there are n-1 positive integers f[2] ,f[3], …, f[n], f[i] describe the father of node i on tree.

Next line there are n positive integers v[2] ,v[3], …, v[n], v[i] describe the value of node i.

n<=100000, f[i]<i, v[i]<=100000OutputYour output should include n lines, for i-th line, output the max number that node i heard.

For the nodes who heard nothing, output -1.Sample Input

4
1 1 3
4 1 6 9

Sample Output

2
-1
3
-1
 
题意 : 给你一颗树,每个结点上面都有一个权值,询问你一任意一个结点作为树根其子树上任意两点的 gcd 的最大值是多少
思路分析 :
  1 . 用 vector 去模拟归并排序,当合并时遇到相同的就记录一下最大值
#define ll long long
const int maxn = 1e5+5; int n;
vector<int>d[maxn], ve[maxn], f[maxn];
void init(){
for(int i = 1; i <= 100000; i++){
for(int j = i; j <= 100000; j += i){
d[j].push_back(i);
}
}
}
int val[maxn], ans[maxn];
vector<int>temp; void merge(int x, int y){
temp.clear();
if (f[x].size() == 0) f[x] = d[val[x]];
if (f[y].size() == 0) f[y] = d[val[y]]; int i = 0, j = 0;
while((i < f[x].size()) && (j < f[y].size())){
if (f[x][i] < f[y][j]) temp.push_back(f[x][i]), i++;
else if (f[x][i] > f[y][j]) temp.push_back(f[y][j]), j++;
else {
temp.push_back(f[x][i]);
ans[x] = max(ans[x], f[x][i]); i++, j++;
}
}
while (i < f[x].size()) {
temp.push_back(f[x][i]);
i++;
}
while(j < f[y].size()) {
temp.push_back(f[y][j]);
j++;
}
f[x].clear(); f[y].clear();
f[x] = temp;
} void dfs(int x){
for(int i = 0; i < ve[x].size(); i++){
int to = ve[x][i];
dfs(to);
merge(x, to);
}
} int main() {
init();
cin >> n; int x;
memset(ans, -1, sizeof(ans));
for(int i = 2; i <= n; i++){
scanf("%d", &x);
ve[x].push_back(i);
}
for(int i = 1; i <= n; i++){
scanf("%d", &val[i]);
}
dfs(1);
for(int i = 1; i <= n; i++) printf("%d\n", ans[i]);
return 0;
}

2 .

 
Count the number of cyclic permutations of length n with no continuous subsequence [i, i + 1 mod n].
Output the answer modulo 998244353.
InputThe first line of the input contains an integer T , denoting the number of test cases.

In each test case, there is a single integer n in one line, denoting the length of cyclic permutations.

1 ≤ T ≤ 20, 1 ≤ n ≤ 100000OutputFor each test case, output one line contains a single integer, denoting the answer modulo 998244353.Sample Input

3
4
5
6

Sample Output

1
8
36 题意 : 有一个循环全排列,求相邻的位置不存在 [i, i+1] 以及 [n, 1] 的排列的方案数有多少个?
思路分析 :
    好菜啊..学的假的组合数学吧....
 

首先先说明什么是循环排列:

即把1-n这n个数随意地放到一个圆圈上,循环排列的不同仅仅取决于这n个数的相对位置的不同。

例如1234,2341,3412,4123这些数为相同的循环排列数。

循环排列没有首末之分,这四个元素随便从哪一个元素开始,绕一个方向转过去,都不改变它们的相对顺序;直线排列则首末分明,原来排末位,调换排首位,已改变它们的相对顺序。循环排列与直线排列的主要区别就在这一点上。

从例子看出,直线排列的个数是循环排列个数的n倍

由直线排列个数为n!可推知循环排列个数为(n-1)!。

讲完了循环排列,再来看此题是求不含子串[i,i+1]或[n,1](以下简称顺序子串,共有n个)的循环排列个数

因为一个排列中可能含有多个顺序子串,所以我们列举至少含有0个,1个,...n个的情况  (注意是至少,因为无法保证恰好含有i个)

包含至少一个顺序子串的循环排列数为C(n,1)*(n-2)!

包含至少两个顺序子串的循环排列数为C(n,2)*(n-3)!

...

包含至少k个顺序子串的循环排列数为C(n,k)*(n-k-1)!

(为什么是(n-k-1)! 当你选出了k个子串之后,至少有k+1个数相对位置已被确定,我们让剩下的(n-k-1)个数全排列即可。)

同时注意到包含n个顺序子串的循环排列数一定是1个。

事件之间相互包含,所以用到容斥原理:

∑(k从0到n-1)(-1)^k*C(n,k)*(n-k-1)!+(-1)^n*1

2018 Multi-University Training Contest 10的更多相关文章

  1. 2018 Nowcoder Multi-University Training Contest 10

    Practice Link J. Rikka with Nickname 题意: 给出\(n\)个字符串,要求依次合并两个串\(s, t\),满足将\(t\)合并到\(s\)中变成\(r\),使得\( ...

  2. 2016 Multi-University Training Contest 10

    solved 7/11 2016 Multi-University Training Contest 10 题解链接 分类讨论 1001 Median(BH) 题意: 有长度为n排好序的序列,给两段子 ...

  3. hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)

    CRB and Tree                                                             Time Limit: 8000/4000 MS (J ...

  4. 2015 Multi-University Training Contest 10 hdu 5406 CRB and Apple

    CRB and Apple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  5. 2015 Multi-University Training Contest 10 hdu 5412 CRB and Queries

    CRB and Queries Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  6. [二分,multiset] 2019 Multi-University Training Contest 10 Welcome Party

    Welcome Party Time Limit: 4000/4000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)T ...

  7. 2015 Multi-University Training Contest 10(9/11)

    2015 Multi-University Training Contest 10 5406 CRB and Apple 1.排序之后费用流 spfa用stack才能过 //#pragma GCC o ...

  8. 2018 Multi-University Training Contest 10 Solution

    A - Problem A.Alkane 留坑. B - Problem B. Beads 留坑. C - Problem C. Calculate 留坑. D - Problem D. Permut ...

  9. HDU - 6430 Problem E. TeaTree 2018 Multi-University Training Contest 10 (LCA+枚举因子)

    题意:一棵树,每个点都有自己val(1 <= val <= 1e5),而任意两个点u,v可以对lca(u,v) 产生gcd(valu,valv)的贡献,求每个点能接受到来自子树贡献的最大值 ...

  10. HDU - 6435 Problem J. CSGO 2018 Multi-University Training Contest 10 (二进制枚举+思维)

    题意:有N个主武器(MW)和M个副武器(SW),每个武器都有自己的S值,和K个附加属性xi.要选取一对主副武器搭配,搭配后获得的性能由该公式得出: 求获得最大的性能为多少. 分析:由于|xm - xs ...

随机推荐

  1. laravel 是怎么做到运行 composer dump-autoload 不清空 classmap 映射关系的呢?

    我看 laravel 的 composer.json 文件 autoload 也没配置 vendor/autoload_classmap.php 里的映射关系,正常来说,如果没有配置,执行 compo ...

  2. Django入门10--admin增强

  3. Spring Data -Specification用法和常用查询方法(in,join,equal等)

    Spring Data -Specification用法和常用查询方法(in,join,equal等) 前言 入门例子 Repository层常用写法 Specification 的用法 总结 前言 ...

  4. liunx重定向控制台消息

    Linux 在控制台记录策略上允许一些灵活性, 它允许你发送消息到一个指定的虚拟控制台 (如果你的控制台使用的是文本屏幕). 缺省地, 这个"控制台"是当前虚拟终端. 为了选择 一 ...

  5. 【u107】数字游戏(bds)

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行 ...

  6. HeidiSQL工具导出导入MySQL数据

    有时候,为了数据方便导出导入SQL,我们可以借助一定的工具,方便我们队数据库的移植,可以达到事半功倍的效果.在这里,就给大家简单的介绍一款能方便导出或者导入MySQL的数据. ①首先,选择你要导出的数 ...

  7. 一道非常棘手的 Java 面试题:i++ 是线程安全的吗

    转载自  一道非常棘手的 Java 面试题:i++ 是线程安全的吗 i++ 是线程安全的吗? 相信很多中高级的 Java 面试者都遇到过这个问题,很多对这个不是很清楚的肯定是一脸蒙逼.内心肯定还在质疑 ...

  8. 使用cnpm i -S axios 遇到报错Install fail! Error: EISDIR: illegal operation on a directory, symlink..........的解决办法

    “今天本来想在cnpm 环境下安装axios,但是在安装axios的时候出现了一些问题.使用cnpm淘宝镜像库下载安装axios的时候报错 Install fail! Error: EISDIR: i ...

  9. dotnet core 获取 MacAddress 地址方法

    本文告诉大家如何在 dotnet core 获取 Mac 地址 因为在 dotnetcore 是没有直接和硬件相关的,所以无法通过 WMI 的方法获取当前设备的 Mac 地址 但是在 dotnet c ...

  10. ZR8.2 DP

    DP 1CF1101D 我们发现,最终答案一定和质因数有关 我们发现\(w_i <= 2*10^5\)级别的树,他的素因子的个数不会非常多(\(<=10\)) 然后我们就设 gcd是\(d ...