2018 Multi-University Training Contest 10
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.
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
#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 .
Output the answer modulo 998244353.
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的更多相关文章
- 2018 Nowcoder Multi-University Training Contest 10
Practice Link J. Rikka with Nickname 题意: 给出\(n\)个字符串,要求依次合并两个串\(s, t\),满足将\(t\)合并到\(s\)中变成\(r\),使得\( ...
- 2016 Multi-University Training Contest 10
solved 7/11 2016 Multi-University Training Contest 10 题解链接 分类讨论 1001 Median(BH) 题意: 有长度为n排好序的序列,给两段子 ...
- hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)
CRB and Tree Time Limit: 8000/4000 MS (J ...
- 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 ...
- 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 ...
- [二分,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 ...
- 2015 Multi-University Training Contest 10(9/11)
2015 Multi-University Training Contest 10 5406 CRB and Apple 1.排序之后费用流 spfa用stack才能过 //#pragma GCC o ...
- 2018 Multi-University Training Contest 10 Solution
A - Problem A.Alkane 留坑. B - Problem B. Beads 留坑. C - Problem C. Calculate 留坑. D - Problem D. Permut ...
- HDU - 6430 Problem E. TeaTree 2018 Multi-University Training Contest 10 (LCA+枚举因子)
题意:一棵树,每个点都有自己val(1 <= val <= 1e5),而任意两个点u,v可以对lca(u,v) 产生gcd(valu,valv)的贡献,求每个点能接受到来自子树贡献的最大值 ...
- HDU - 6435 Problem J. CSGO 2018 Multi-University Training Contest 10 (二进制枚举+思维)
题意:有N个主武器(MW)和M个副武器(SW),每个武器都有自己的S值,和K个附加属性xi.要选取一对主副武器搭配,搭配后获得的性能由该公式得出: 求获得最大的性能为多少. 分析:由于|xm - xs ...
随机推荐
- Python--day38---进程间通信--初识队列(multiprocess.Queue)
初识队列: 进程间通信IPC(Inter-Process Communication) 1,队列的方法: q = Queue(5)1,q.put(1) #把1放进队列 2,print(q.full() ...
- java Class中得到构造方法Constructor、方法Method、字段Field
常用方法: Constructor类用于描述类中的构造方法: Constructor<T> getConstructor(Class<?>... parameterTypes) ...
- idea运行项目时报错:Error:java无效的源发行版:1.8
解决办法:project structure中设置 JDK 和language 匹配即可.如图: 另外如果有maven,需要把maven中JDK版本设置成一样的.
- java位运算和无符号运算
计算机在底层使用的是二进制补码进行运算. 计算规则: 正数的原码.反码.补码是其二进制本身. 负数的原码首先计算其二进制数,然后最高位使用1表示负数,反码是最高位不变其它位取反,补码是在反码的基础上进 ...
- linux并口纵览
因为我们期望大部分读者以所谓的"个人计算机"的形式使用一个 x86 平台, 我们觉得值 得解释一下 PC 并口如何设计的. 并口是在个人计算机上运行数字 I/O 例子代码的外设 接 ...
- phpcms 增加备案号、联系方式等字段
准备好记事本或者dreamweaver或者其它文本编辑器 打开\phpcms\languages\zh-cn\admin.lang.php PHPCMS的中文语言定义文件. 查找“site_manag ...
- <QluOJ2018NewCode>计算几何(寄蒜几盒)
题目描述 现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 这若干个点在圆圈上按顺时针顺序分布. 如果可以的话输出"Yes"(不含引号 ...
- CITRIX VPX配置四层负载
网络拓扑如下: Step1:开启四层负载特性 在Configuration->Traffic Management->Load Balancing上右键弹出菜单点击enable,如下图: ...
- (1)51单片机NOP指令
提问:什么是NOP指令?干什么用的?单片机程序里执行一条nop指令需要多长时间? (1)一个NOP就是一个机器周期 (2)空指令,延时一个机器周期 (3)这个与单片机型号.指令类型和使用的晶振频率有关 ...
- 如何修改eclipse中Dynamic web module的 version
我们直接在eclipse中修改Dynamic Web Module的话会报错,改不了的 所以我们可以找到项目文件中的.setting文件下的org.eclipse.wst.common.project ...