The 16th UESTC Programming Contest Warmup
qsCQeszE
题意:k种颜色的花,每一种都有无数朵,有n个妹子,问你有多少种方案,每个女生送一朵花,恰好K种颜色都送出去了
很简单,直接容斥就好了F[i]表示送了小于等于i种,F[i] = C(k,i) * i ^ n.然后答案就是F[k] - F[k - 1] + F[k - 2] ...
复杂度O(klogn)
n <= 5e4,k <= 30
Amaz1ng Prime
题意:给你一棵树,问你有多少路径的长度是素数,每条边的权值是0/1
直接点分治+FFT nlog^2n
n <= 1e5
Excited Pe0ple
题意:有两组数,让你删掉最少的数,使得每个数和另一组的任意一个数都是互素的。
n ,m <= 1e5,分别表示这两组数的个数
a[i] <= 2e4 表示数的大小
直接网络流,考虑到最暴力的建图就是把每个数都连向非互素的数,权值为inf,然后源点连第一组数,汇点连另一组,权值都是1.
但是这样肯定会tle。
然后发现权值比个数小,所以可以再一步优化,把每个数压起来,源点连第一组数,汇点连另一组,权值变成了那个数的个数。
发现还是图还是很大
但是实际上我们可以在中间加一层转接的点,这些点都是素数,然后建图变成了,每个数往自己的素因子连一条边,这样边的数量就变成了AlogA的级别
GC?(X,Y)
题意:定一个gc?(x,y)表示,这两个数的素因子分解后排序,gc?(x,y)就是他们的最长公共前缀的乘积
比如gc?(12,20) = gc?(2 * 2 * 3,2 * 2 * 5) = 2 * 2 = 4.
然后求任意两个数的gc?的和
每个数的素因子的个数是log级别的,有两种方法做
一个你可以先排序,对于一个数来说,它后面每个数和它的gc?是逐渐递减的,所以我们可以直接二分,因为最多只有log段,所以复杂度就是nlog^2n
还有一种方法
你可以把全部的前缀都hash起来.
pre[i][j]表示第i个数,前缀j的哈希值
然后对于一个数来说H[pre[i][j] ] - H[pre[i][j + 1]]就表示与a[i]这个数最长前缀长度为j的个数
一个简单的容斥应用。然后就做完了
Fact0rial
题意:求n! % 1e11 + 3
n <= 1e11 + 3
看过去就是分段打表了,但是注意打表的时候要用快速乘,然后我是隔25000000打一个数,卡过去了
其他题貌似挺简单的