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打一个数,卡过去了

其他题貌似挺简单的

posted @ 2018-03-19 15:21  scau_zk  阅读(236)  评论(0编辑  收藏  举报