摘要:
该题就是给定一个数,求某个区间内有多少数与这个数互质。首先我们要明确,对于一个给定的区间,我们如果能够求出这个区间内所有与其不互质的数的个数的话,那么互质数的个数也就求出来。这个叫做反面求解。对于任何一个正整数N,都有其唯一的素因子分解形式,我们可以这样想,任何与N不互质的数一定是其某一个质因子的倍数,所以我们通过某一个质因子能够确定一个范围内的有多少个数该质因子的倍数的数。但是这并不是所有不互质数的充分条件,对于另外的质因子同样满足能够确定一系列的数,我们要做的就是融过容斥定理求他们的并集。代码如下:#include <cstdlib>#include <cstring&g 阅读全文
摘要:
这题也算是技巧性较强的一题,这题与上一题HDU-4311唯一的不同分出了八个方向,而且这八个方向没有上题那么和谐了,有四个方向的曼哈顿距离不再是1,也就是说题中所给定的逻辑距离在曼哈顿距离上没有了的体现,不过如果你数学素养好的话,有一个距离叫做切比雪夫距离 D = max(|x1-x2|, |y1-y2|),可以发现虽然曼哈顿距离有了改变,但是切比雪夫还是帮助我们找到了共同点,因为从一个点到另外一个点我们始终会先选择走斜线,一单位斜线相距离当于两单位曼哈顿距离,之所以只取最大值,是因为小的一部分曼哈顿距离我们可以通过斜线来消掉。如果数据量不大的话,我们就可以根据这个方法直接暴力了,但这好像对这 阅读全文
摘要:
该题题义是给定如下一个方程组:F(1) = C1 (mod) PF(2) = C2 (mod) PF(3) = C3 (mod) P ...其中F(1) = A(1,1)*x1 + A(1, 2)*x2 + A(1, 3)*x3...其中A(i, j) = i ^ (j-1).面对这样一个方程,我们的做法就是先不管方程右端的(mod)P,因为F(i) 和 Ci 是同余的,那么在方程两端乘以一个数是没有影响的,代入某一个方程同样是允许的。于是剩下的就是高斯消元。由于解是唯一的,因此解出来的系数矩阵一定是满秩。接下来就可一用扩展gcd求解未知元了。代码如下:#include <cstdlib 阅读全文
摘要:
该题就是考的是如何花最小的代价使得一棵树划分开且不含后同类节点。我们将边按从大到小的顺序排好序,然后就是看是否这条边能够使得两个同类的节点连在一起,如果能够的话,那么这条边就是我们要选择的划分边。首先将特征值保留起来,并通过并查集扩充给标记点。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#include <map>#include <algorithm>using namespace std;int N, M, set[100005], have[100005]; 阅读全文
摘要:
这题在比赛的时候没做出来实在是不应该。本来也是用对数处理的,但是后面写的七零八落的。这题也可以直接求,记录每个点最少消耗的流量,剩余流量为初始流量减去这个值,逐步向下迭代。当然这里可以去求他的剩余值,根据公式 最后的流量 L = I * (1-p1) * (1-p2) * ... * (1-pn) 我们对两边同时取对数的话,那么我们就将乘法化成了加法,并且直接求一个最长路就可以了。最后再拿总流量减去最大的剩余量即可。代码如下:#include <cstdio>#include <cstring>#include <cstdlib>#include <q 阅读全文
摘要:
该题具有一定的技巧性,需要在Nlog(N)的时间复杂度下计算出任意一个点,N-1个点到其的距离综和,这里需要运用这样一个技巧,将x,y分开计算,首先计算x轴的距离,那么就先排一次序,然后有到P号点的距离和为 (P-1) * Xp - sum(X1...Xp-1) + sum(Xp+1...Xn) - (N-P) * xp; 同理可计算出y轴的距离,这两个距离是累加到一个结构体上的。所以最后直接找最小值即可。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath& 阅读全文
摘要:
这题用贪心是很容易过的,直接先杀死对方单位时间输出较高的对象。这题的动态规划解是将N个敌人压缩到一个int数里面,dp[j] 表示在剩余了j这个数里面所蕴含的敌人的情况下的最大扣血量。dp方程为 dp[s] = min( dp[s - {bit}] + sumdps[s] * h[bit] ) 其中bit枚举每一位。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int dp[1200000], N, 阅读全文
摘要:
代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#define TO(x, y) (x-1)*N+yusing namespace std;char G[30][30];int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1}, N;int C;inline bool judge(int x, int y){ if (x < 1 || x > N || y < 1 || y > N) { 阅读全文
摘要:
这题我们可以参考开关那题,只不过这里是求最少的操作次数,那么我们需要对变元进行枚举,算出所有的情况下,最少需要改变的次数。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#define TO(x, y) (x-1)*4+yusing namespace std;char G[6][6];int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};inline bool judge(int x, int y){ if 阅读全文
摘要:
这题是给定N个灯的初始和最终状态,再给定一些关系,这些关系说明按某个开关可能影响其他的灯的开关情况,可以将这种关系视为一种取反的关系。对于这题我们假设一组数据:30 1 01 1 01 22 31 33 20 0对于以上的数据,我们用矩阵来表示整个操作的过程和状态 0 1S = 1 E = 1 0 0我们可以很显然的知道,某个等的亮灭情况将体现出各个开关的复合结果,因此我们可以得到这样的方程组,模二加等价于异或操作:E(a) = xa*A11 ^ xb*A12 ^ xc*A13 ^ S(a);E(b) = xa*A21 ^ xb*A22 ... 阅读全文