随笔分类 - ACM_数学
摘要:转自:http://hi.baidu.com/vfxupdpaipbcpuq/item/0cbe522c3c9e4bcaa5275a121.小区间素数个数,百万级别。 简述:有的时候,我们需要知道某个特定区间的素数(区间大小较小,但数可能很大)。那么数组就开不下,这时候我们仍然可以使用筛法,只是所有的下标都进行了偏移。大家理解下面这段代码可以先用普通筛法写,然后数组下标集体移动即可。const int maxn = 100000;int PrimeList[maxn];int PrimeNum;bool IsNotPrime[maxn]; // IsNotPrime[i] = 1表示i ...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3864 题意:给定一个数n,求n的因子只有四个的情况。 Miller_Rabin和Pollard_rho模板题,复杂度O(n^(1/4)),注意m^3=n的情况。 1 //STATUS:C++_AC_62MS_232KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #...
阅读全文
摘要:原来还有如此简单粗暴的办法,当数字比较小(比如10^9)时,我们可以用sqrt函数直接求平方根。但是当数字达到10^20时,sqrt就没用了。此时我们可以用二分来找平方根。但是如果又要精确到小数点后若干位,那么二分也不知道要跑多久。于是我们使用手动开方的算法。首先将数字每两位分成一段。如:745836942。就分成:7|45|83|69|42,即从个位开始分。共分成五段,第一段是7。对第一段的数字7开方取整,可得到2。此时,要在2后面接一个数字b,并在7后面加上下一段的数45,使产生的两位数2b的平方不大于745。我们知道,数是10a+b,其平方是100a^2+20ab+b^2。我们可以暂..
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29365 首先排序,然后维护一个后缀,等差求下和就可以了。。 1 //STATUS:C++_AC_2090MS_1716KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include...
阅读全文
摘要:题目链接:http://poj.org/problem?id=2480 题意:多次求sigma(gcd(i,n), 1 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21 #include 22 //#in...
阅读全文
摘要:题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2705 题意:求 sigma(gcd(i,n), 1 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include...
阅读全文
摘要:题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2820 题意:多次询问,求1 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #i...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4704 题意:求a^n%m的结果,其中n为大数。 S(1)+S(2)+...+S(N)等于2^(n-1),第一次多校都出过吧。然后就是一个裸的大数幂了。。 关于大数的A^B mod C推荐看AC神的两篇文章,... 当然,这个还以一个更简单的方法,由费马小定理:a^(p-1)=1(mod p),那么a^n=1(mod p)可以转化为:2^(n%(1e9+7-1)) % 1e9+7... 1 //STATUS:C++_AC_15MS_1360KB 2 #include 3 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4686 因为ai= ai-1*AX+AY ,bi= bi-1*BX+BY ,那么ai*bi=AX*BX*A*ai-1*bi-1+AX*BY*ai-1+BX*AY*bi-1+AY*BYAY。令Sn为ai*bi前n项的和,Sn=Sn-1 + an*bn,因此我们可以构造一个如下的转移矩阵: 然后矩阵乘法优化就可以了。。。 注意此题n=0的情况! 其实矩阵大小只要5就可以了,那几个常数项可以合并到一列。。。 1 //STATUS:C++_AC_1296MS_232KB 2 #inc...
阅读全文
摘要:题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2301 题意:多次询问,求有多少对数满足 gcd(x,y)=k, a 1 //STATUS:C++_AC_2052MS_2052KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4135 题意:求区间[A,B]与K互素的数的个数。 首先对K分解质因数,然后容易原理搞,复杂度O(sqrt K).. 1 //STATUS:C++_AC_0MS_228KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #...
阅读全文
摘要:题目链接:http://www.spoj.com/problems/VLATTICE/ 题意:求gcd(x,y,z)=1,1 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21 #include 22 #i...
阅读全文
摘要:题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2005 题意:题目转换后的模型就是求Σ(gcd(x,y)), 1=2就行了... 1 //STATUS:C++_AC_16MS_2052KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 ...
阅读全文
摘要:题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2190 简单的欧拉函数题,实际上就是求gcd(x,y)=1, 0 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #i...
阅读全文
摘要:题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1有详细介绍。现摘录如下:下面代码就是带有计算欧拉函数的线性筛素数。代码原型的起源已经无从考证,可以作出一个合理的揣测,是某位搞OI或者ACM/ICPC的神牛第一次写出来的。1234567891011121314151617181920bool com[MAXN];int primes, prime[MAXN], phi[MAXN];phi[1] = 1;for (int i = 2; i j1)在i = i1, j = k的时候被筛掉一次,又在i =...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4678 题意就不说了,太长了。。。 这个应该算简单博弈吧。先求联通分量,把空白区域边上的数字个数全部求出来a[i](就是一个连通分量),然后就是n堆石子,每堆每次可以取一个或者全部取掉,然后要注意在取玩边上的石子后,剩下的就只能一次取掉了,因此我们直接把空白区域上的算做一个a[i]+1。然后这个SG函数很好求,奇数是1,偶数是2。。。 1 //STATUS:C++_AC_156MS_4268KB 2 #include 3 #include 4 #include 5 //#in...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4675 题意:给一个大小为N的数列a[i],然后一个数M以及一个数K,要你求得一个数列b[i],其中b[i]有K个数与a[i]中的不相同,使得gcd(b[i])=j。对于每个 j ,求出满足的b[i]的个数。。 首先我们统计数列a[i]每个数的个数,假设现在求gcd(b[i])=j,那么可以在t=M/j的时间内求出 j 的倍数的个数cnt。那么就相当于在cnt个中选择N-K个不变C(cnt,N-K),在剩下的 j 的倍数中有(t-1)^(cnt-t)种,非 j 的倍数中有t^(N-cnt)种...
阅读全文
摘要:题目链接:http://poj.org/problem?id=2926 题意:求5维空间的点集中的最远曼哈顿距离。。 降维处理,推荐2009武森《浅谈信息学竞赛中的“0”和“1”》以及《论一类平面点对曼哈顿距离问题》。 1 //STATUS:C++_AC_735MS_184KB 2 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4664 题意:一个平面上有n个点(一个凸多边形的顶点),每次可以连接一个平面上的两个点(不能和已经连接的边相交),如果平面上已经出现了一个三角形,则不能在这个平面上继续连接边了。 首先在最优情况下,优先考虑的是一个点不连两条直线,否则就直接输了。因此一个n个点的局面连了一条直线后,分为了两个子游戏,i个点和n-i-2个点,则sg[n]=mex(sg[n]^sg[n-i-2])。然后打表找规律,发现大于n大于68后就是34的循环节了。 1 //STATUS:C++_AC_203MS_428KB...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4655 先不考虑相临的有影响,那么总数就是n*prod(ai),然后减去每个相邻的对总数的贡献Σ( Min(a[i],a[i+1])*prod(i-1)*prod(i+2) ),其中prod(i)为[1,i-1]这个区间a[i]的积,prod(i+2)表示的是[i+2,n]这个区间,答案就是n*prod(ai)-Σ( Min(a[i],a[i+1])*prod(i-1)*prod(i+2) ),可以得到取得最大值是ai的排列就是最小,最大,次小,次大,例如:1 2 3 4 -> 1 4 2 3
阅读全文