题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2841
题目大意:
在平面到两点之间的矩形中一共有棵树,求站在点的人一共能看到多少棵没有被挡住的树?
分析:
如果一棵树的坐标为,且 ,则,说明在点到点的线段延长线上,所以会被挡住
那么只要枚举所有满足坐标,的点即可,基本的容斥过程
代码:
1 | #include <cstdio> |
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2841
题目大意:
在平面(1,1)到(n,m)两点之间的矩形中一共有n×m棵树,求站在点(0,0)的人一共能看到多少棵没有被挡住的树?
分析:
如果一棵树的坐标为(x,y),且g=gcd(x,y)=1 ,则(x′,y′)=(gx,gy),说明(x,y)在点(0,0)到点(x′,y′)的线段延长线上,所以(x,y)会被挡住
那么只要枚举所有满足坐标(x,y),gcd(x,y)=1的点即可,基本的容斥过程
代码:
1 | #include <cstdio> |
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5778
题目大意:
给定一个数x,求正整数y≥2,使得满足以下条件:
1.y−x的绝对值最小
2.y的质因数分解式中每个质因数均恰好出现2次。
简单分析:
y的质因数分解式中每个质因数均恰好出现2次,显然y是个完全平方数,但不是所有的完全平方数满足每个质因数恰好出现2次,y−x绝对值最小的数,显然当y在x附近且满足条件时,绝对值最小,对x分解质因数,若有一个因数出现2次以上,则不满足条件,减小此值,继续向下搜索,由于这样的数出现的非常频繁,所以复杂度不会爆,然后再从x+1开始向上查找,直到找到一个满足的值,比较两次找到的数的平方与x的绝对值,最后输出小的那个
注1:第二次从x+1开始主要是为了防止某个数x,x满足条件,但x+1也满足,且答案更小,
注2:由于y≥2,还需要加特判当x≤4时,y都只能等于4,4为最小的满足条件的y值,此时当输出4−x
1 | #include<stdio.h> |
题目链接:
BC #80 B Segment
题意:
Rivendell非常神,喜欢研究奇怪的问题.
今天他发现了一个有趣的问题.找到一条线段x+y=q,
令它和坐标轴在第一象限围成了一个三角形,然后画线连接了坐标原点和线段上坐标为整数的格点.
请你找一找有多少点在三角形的内部且不是线段上的点,并将这个数对P取模后告诉他.
输入p和q。q是质数且q≤1018,1≤P≤1018
分析:
答案的公式是ans=(q−2)∗(q−1)/2;
但是因为p和q的范围太大!直接乘的话会爆long long!!!
所以需要手动写快速乘法,类似于快速幂的写法!!!
1 | #include <iostream> |
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1251
题目大意:
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
分析:
读入单词直接插入即可,由于这里要查询的是以该前缀为起始的单词数量,所以在加单词的时候,不仅要在单词末尾加值,同时在路径上所有结点都应该价值,最后查询该单词的权值即可
代码:
1 | #include<cstdio> |
题目链接:
http://acm.hust.edu.cn/vjudge/contest/70017#problem/I
题目大意:
求调和级数前n项的和,T个样例,(1≤T≤10000,1≤n≤108)
分析:
直接求肯定TLE,但是如果使用公式的话前几项精度不够,所以前106或107项
O(N)暴力跑出,然后使用高精度的调和级数求和公式,具体可以搜索维基百科或者百度欧拉常数
http://baike.baidu.com/link?url=BWFVuV7oshbt5k7Z2HhvmV84MlXGg2bBE0_MJsQ9ZOJLI8o773s5-Z6k6xK7csGekpFwn0kn539eYbgY-lUDeq
最后的三个公式是表示欧拉常数,y=Hn−2ln n+ln(n+1)−6n(n+1)1+30n2(n+1)21 (Hn为调和级数前n项的和)
代码:
1 | #include <iostream> |
题目链接:
http://acm.hust.edu.cn/vjudge/contest/70017#problem/Z
题目大意:
有些数既是一个数的p次方,又是另一个数的q次方,称这样的数为Super Power,没有输入,输出所有这样的数
分析:
显而易见,满足可以写成两个以上的数不同次方的数,它的次方数必然是个合数,同时由于最小的合数是4,所以最大的底数是4264−1<216
至多65536个数,每个数至多64次幂,O(106),不会T
为了防止重复,最好使用集合来存数,最后用迭代器输出集合,注意循环从2开始的话需要在一开始向集合里插入一个1
1 | #include<iostream> |
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=6050
题目大意:
对Fx,y给出三个定义式,求Fm,1%1000000007之后的值
分析:
根据$F_{1,i} = F_{1,i-1} + 2*F_{1,i-2} $可以看出 F1,i−2F1,i−1成等比,然后迭代即可求得F1,i的通项,然后求和便是F2,1的值,之后发现,然后再对第二行的前n个数求和,得到F3,1即可发现答案,或者打表寻找在不同的n下,从F2,1到F3,1及后面多个数的变化即可发现
Fm,1={(2n−1)∗F2,1 n is even(2n−1)∗Fm−1,1−S1,n−1 n is odd
n为奇数时减去的常数也可以由打表找出,打表发现n=3时,F3,1=(23−1)∗F2,1−2 , n=5时,F3,1=(25−1)∗F2,1−10 ,而n=7时,常数为42,可以发现C(n−1)/2=4∗C(n−3]/2+2继续拆解构造数列通项式即可得到常数的表达式,然后快速幂即可得到答案,中间分数用逆元处理
代码:
1 | #include <bits/stdc++.h> |
题目链接:
https://vjudge.net/contest/70325#problem/A
题目大意:
给定两个数字串,第一个为待匹配串,第二个为模式串,求模式串第一个在待匹配串中出现的下标,没有则返回-1
分析:
简单修改KMP模板即可应用到数字串匹配上
代码:
1 | #include <cstdio> |
题目链接:
http://poj.org/problem?id=3744
题目大意:
一个人,一开始处于位置1,在n个位置上有地雷,不能接触,每次人有p概率向前走一步,有1−p概率向前跳两步,请问安全走过雷区的概率是多少,地雷位置x∈[1,100000000]
分析:
dp[i]表示走到i处的概率的话,可以很快推出
dp[i]=p∗dp[i−1]+(1−p)∗dp[i−2]
即dp[i]是由dp[i−1] 与dp[i−2]贡献得到,那么从1开始,向上不断贡献,遇到地雷位置跳过,然后走到a[n]+1位置的概率即是答案,但是根据题意a[n]+1过大,且有多组数据,所有需要优化。
可以发现在每段中,情况几乎都相同,而且dp转移式很自然的能想到斐波那契F[i]=F[i−1]+F[i−2] ,所以这题可以用矩阵快速幂计算每一段的概率值,下一段的起点即是之前一个地雷的下一个位置,分别计算不走到各地雷的概率并作积即可
注意:
代码:
1 | #include<stdio.h> |
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5902
题目大意:
给定n个数,每次操作可以取其中3个,选择其中两个作gcd运算,并向原串中添加两次gcd结果,即a,b,c三个数,可取a,b作gcd(a,b)=g,将g写入原序列两次,求进行n-2次操作后,留下的数可能是什么
分析:
每次操作,取三个数,放回两个数,同时放回的数必定是原序列中数两两gcd,或gcd的结果再多次gcd,则此时题意已很明了,只需从前向后扫,加当前数与集合中所有数gcd的结果也加入集合中,最后输出集合中所有数即可得到答案,此外,要注意,由于一开始要丢弃一个数,最后得到的答案中,所有数的gcd需要特判,如果在循环中该值只出现了一次,则要删除,因为循环本身会产生该值,但这是无法出现的
代码:
1 | #include <iostream> |