数论
文章平均质量分 65
bookybooky
http://blog.163.com/happyliyifan126/
展开
-
POJ 1006/ ZOJ 1160: Biorhythms - 中国剩余定理
题意:p e i分别代表的是三个高峰出现的时间(该年的第几天)d是给出的该年的第几天,让你从这一天开始求到它下一次三个同时高峰所经历的天数(一)一般解法解题思路:先确定一天的高峰期,然后每次循环都加23(确保那天是p的高峰期),再去判断是否e,i的高峰期易错:循环开始前的d++必须的,因为是算下一次三个同高峰 (0 0 0 0可知)(1) POJ//Boirhythm#include#incl原创 2015-01-10 21:42:53 · 525 阅读 · 0 评论 -
POJ 3641 : Pseudoprime numbers - 米勒罗宾素数测试
题意:输入p,a,两个数如果p是素数输出no,如果p不是素数,根据以a为基的伪素数定义,判断p是否是以a为基的伪素数。分析:判断a^p%p==a是否成立,如果成立输出yes,否则输出no只有当p是合数且a^p = a ( mod p ) 时,才输出yes。直接应用素数测试定义进行判断。**米勒罗宾素数测试 Miller_Rabin算法原理及实现LL random(LL n){...}LL mu原创 2015-01-10 21:44:09 · 1735 阅读 · 0 评论 -
POJ 2478 : Farey Sequence - 欧拉函数
题意:法雷级数由一系列不能约分的分数按递增顺序排列。计算Fn中有多少个分数。分析:一个法雷序列Fn中分数的个数,即 分别与2,3,4,5,...,n-1,n互素的数的个数和。亦即求从2到n连续的欧拉函数值的和。N是2~1000000的数,故可直接用欧拉函数的递推方法求解,打表预处理前n项即可。216ms G++#include#include#include#define LL long long原创 2015-01-10 21:44:20 · 627 阅读 · 0 评论 -
POJ 2183 : Bovine Math Geniuses - 平方取尾法
题意:每次取一个六位数字的中间四位平方后取后六位,一直这样产生数字。问什么时候开始循环。分析:按平方取尾法生成的序列,对每一个出现的六位数对其进行标记并记录位置。一旦出现重复即结束查找。另:由于是六位,由鸽巢原理,循环长度一定是在1百万以内的。所以可以直接模拟就行了。2183Accepted4616K0MSG++379B#include#include#include#include#includ原创 2015-01-10 21:44:38 · 683 阅读 · 0 评论 -
POJ 2992 : Divisors - 求组合数的因子个数
题意:输入为n,k,求出C(n,k)(n>=k)的约数个数。 n,k 263 - 1分析:k,n比较大,不可能直接求组合数。现在要求约数的个数,首先进行素因子分解,组合数写成阶乘形式,先对阶乘进行素因子分解。步骤:(1)筛选431内素数;(2)对每个阶乘进行素因子分解;(3)求组合数的素因子分解; 得到约数个数。n=p1^e1 * p2^e2 * ... * pn^en其中p1,,p2,,pn原创 2015-01-10 21:44:28 · 775 阅读 · 0 评论 -
POJ 3132 / ZOJ 2822 : Sum of Different Primes - 动态规划,01背包,素数筛
题意:输入两个整数:n(输出这样的素数集合的个数。分析:现在令p[]为[2....1200]的素数表;f[i][j]为j拆分成i个素数和的方案数。ip[]用筛选法求,长num,每输入一对n和k用动态规划求出k个不同素数和为n的方案数。 枚举p[i], 按递减顺序枚举素数个数j(j=14…1)。 按递减顺序枚举前j个素数的和s(s=1199…p[i])。 累计p[i]作为第j个素数的方案总数f[j]原创 2015-01-10 21:45:00 · 719 阅读 · 0 评论 -
POJ 2480 : Longge\'s problem - gcd之和
题意:给出正整数n,计算所有gcd(i,n) (1分析: 在数论中的积性函数概念:对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数。若对于某积性函数 f(n) ,就算a, b不互质,也有f(ab)=f(a)f(b),则称它为完全积性的。 gcd(i,m*n)=gcd(i,m) * gcd(i,n),m,n互质,故gcd原创 2015-01-10 21:44:31 · 492 阅读 · 0 评论 -
POJ 2800 : Joseph\'s Problem (须仔细分析)
(寒假马拉松第一场 K题)在题目中有三种情况:1、1;2、k == n ;3、k>n;对于第一种情况我们可以分为1到k和k到n两个子问题来解。1.1、1到k: for( i = 1 , sum = 0 ; i 1.2、k到n: sum =(n-k)*k;而对于第二种情况就是第一种情况的(1)。但是就这样写的话时明显的tle的。对于第二种情况也可以分为几个小问题来求解:2.1、1到k/2:原创 2015-01-10 21:45:56 · 564 阅读 · 0 评论 -
POJ 1032 : Paliament - 整数分解
题意:求N1+N2+...+Nn=N. 使N1 ,N2...Nn都不相等且他们的乘积最大?分析:要多思考@_@即求出以2起始的最大连续自然数序列之和sum,使得sum的值不超过输入数n, 然后分情况讨论:设此最大序列为2、3、……、w,则:1。若剩余值(n-sum)等于w,则最后输出序列为:3、4、……、w、w+2,即将原最大序列每项加1,再将最后剩余的一个1加到最后一项上。(这一项结果很显然)2原创 2015-01-10 21:44:52 · 672 阅读 · 0 评论 -
POJ 3696 : The Luckiest number - 欧拉函数,快速幂[数论好题]
题意:Bob最喜欢的数字是8,他的幸运数字是能整除L的全8序列的最短长度。请找到Bob的幸运数字,若无则输出0例如:L=1,ans=1;L=2,ans=1;L=8,ans=1;L=11,ans=2.分析:注意到凡是那种1111111..... 2222222..... 33333.....之类的序列都可用这个式子来表示:k*(10^n-1)/9进而简化:8 * (10^n-1)/9=L * k原创 2015-01-10 21:44:35 · 635 阅读 · 0 评论 -
POJ 3090 : Visible Lattice Points - 欧拉函数
题意:称 线段可见 当且仅当 从点(0,0)到(x,y)不经过其他整点。给出一个可见点N,计算在区域0分析:线段可见 即 x,y不可以约分,即x,y互素。问题即可转化为求1~n内互素的数的对数,即可通过求1~n的欧拉函数值解决。同前一个题目一样,打表预处理。0ms G++#include#include#include#define LL long longusing namespace std;原创 2015-01-10 21:44:24 · 531 阅读 · 0 评论 -
POJ 3012 : A Number from Yanghui Triangle - 快速幂;推公式
用到快速幂的模版然后推公式((1+10^k)^n)%m3012Accepted700K735MSG++358B#include #include using namespace std;#define LL long longLL qm(LL a,LL k,LL m){ LL re=1,y=a%m; for(;k;k>>=1,y=y*y%m) if(k&1ll) re=y*re%m; return原创 2015-01-10 21:45:04 · 855 阅读 · 0 评论 -
POJ 3518 : Prime Gap - 素数筛
题意:长度为n素数间隔:两个相邻素数p和p+n之间,n-1个连续合数组成的序列给出一个正整数k,编写一个程序,计算包含k的素数间隔的长度。若没有包含k的素数间隔,则长度为0。分析:令ans[k]为 包含k的素数间隔的长度。显然,若k是素数,则ans[k]=0;若k为合数且k在p1与p2中间,则k所在合数区间内每个合数的ans值都为同一个数。ans[p1+1]=ans[p1+2]=……=ans[p2原创 2015-01-10 21:44:48 · 616 阅读 · 0 评论 -
POJ 2413 : How many Fibs? - JAVA大数! / 二分查找+大数加法
给出两个数a,b (a 大数!PS:大数没有a==b这种形式,要用a.compareTo(b),返回1,0,-1坑:这里的斐波那契数列是以 1 2 3 5 8开始,不是 1 1 2 3 5 8import java.util.*;import java.text.*;import java.math.*;public class Main {原创 2015-05-30 14:48:24 · 707 阅读 · 0 评论 -
POJ 2909 / ZOJ 1657 : Goldbach\'s Conjecture - 筛法打素数表
和前面的POJ 2262类似输出及细节处理略有不同题意:给出一个偶数,要求在这个偶数的范围内,有几对素数和是等于这个偶数的分析:这次是验证哥德巴赫猜想的解有多少个,同样核心是打素数表 思路和POJ 2262差不多,筛法打素数表 注意素数对的不重复性! #include#include#includeusing namespace std;const int N=1000002;bool b[N]原创 2015-01-10 21:43:59 · 471 阅读 · 0 评论 -
POJ 1305:Fermat vs. Pythagoras - 勾股定理/毕达哥拉斯三元组
题意:题意:给一个数n,求满足x^2+y^2=z^2,x思路:根据毕达哥拉斯三元组相关定理(《数论及应用》P110的定理4.5),几个未知数满足方程组,要求所给范围内的本原毕达哥拉斯三元组数,只需对m,n分别枚举。然后将三元组乘i,即可。我们知道这个勾股方程可以化为(r^2-s^2)^2+(2*r*s)^2=(r^2+s^2)^2,x=r^2-s^2,y=2*r*s,z=r^2+s^2,所以可以枚原创 2015-01-10 21:43:48 · 907 阅读 · 0 评论 -
POJ 1995/ ZOJ 2150 : Raising Modulo Numbers - 快速幂取模
题意:给定表达式中各变量的值,计算表达式(a1^b1+a2^b2+...+an^bn)%M的值思路:整数快速幂。通过计算整数快速幂计算各个ai^bi%M的值,然后再求和。由数论可知,表达式的求余可以先对加法各项求余,再求和求余。所以分别计算各ai^bi时,应直接代入求余。用整数快速幂算法算出每一个幂值,然后依次相加取模即可#include#includeusing namespace std;#d原创 2015-01-10 21:43:38 · 633 阅读 · 0 评论 -
POJ 2773:Happy 2006 - 第k大与n互素的数
题意:给出n和k求出第k个与n互素的数解法一:(效率较低 2235MS)如果知道欧几里德算法的话就应该知道gcd(b×t+a,b)=gcd(a,b) (t为任意整数)则如果a与b互素,则b×t+a与b也一定互素;如果a与b不互素,则b×t+a与b也一定不互素故与m互素的数对m取模具有周期性,则根据这个方法我们就可以很快的求出第k个与m互素的数假设小于m的数且与m互素的数有k个,其中第i个是ai,原创 2015-01-10 21:44:03 · 733 阅读 · 0 评论 -
POJ 1674 : Sorting by Swapping - 置换群
题意:给一个由1-n的整数组成的数列。对其进行交换两个数的操作。请问最少需要多少次操作,使得数列变成升序的1-n(n的一个全排列中要变成顺序需要几次交换)主要是一个找循环节的过程,ans=n-循环节个数。32MS#include#include#includeint num[10002];bool vis[10002];using namespace std;int solve(int n){ i原创 2015-01-10 21:44:06 · 866 阅读 · 0 评论 -
POJ 2689/ ZOJ 1842: Prime Distance[两次筛法/筛选法平移]
这道题是学习素数筛法的经典,应用到了区间筛素数。具体思路是先筛出1到sqrt(2147483647)之间的所有素数,然后再通过已经晒好素数筛出给定区间的素数。题目中的U,L最大值可为整型上限,用纯粹的暴力筛法肯定要超时?怎么办,用二次筛法。U和L之间的合数,质因子不超过O(L^0.5),于是用筛法选出50000内的素数即可,因为50000的平方大于整形上线了。再用这些素数去筛出U-L之间的合数,剩原创 2015-01-10 21:43:24 · 769 阅读 · 0 评论 -
POJ 3243: Clever Y 求A^X = B (mod C) / BabyStep_GiantStep
题意:求最小的Y,满足XY mod Z = K高次同余方程,用hash做,套模板。。参考:一:http://ideone.com/tDiDn二:http://blog.csdn.net/ivan_zjj/article/details/7597109但是这题和上题有个不同点就是这题的C没有限制条件,也就是说这题并没有规定C必须是质数。思路: 还是用 babystep_gaintstep算法原创 2015-01-10 21:43:31 · 724 阅读 · 0 评论 -
POJ 2142 : The Balance-解不定方程,一元线性同余
题意:有一天平质量为a和b的砝码已知砝码数量不限且天平左右均可以放砝码,现在要求用天平称出c的物品各需要多少解法一:转化为ax+by=c的一组整数解(x,y)要求|x|+|y|尽量小利用扩展欧几里得求出特解x0 和 y0然后给出通项公式x=x0+a/d*t y=y0+b/d*t 对于方程的全部解x=x0+(a/d)t y=y0+(b/d)*t |x|+|y|= | x + b/g*原创 2015-01-10 21:43:45 · 525 阅读 · 0 评论 -
POJ 1320:Street Numbers——佩尔方程
题意:方程 1+2+3+...+n=(n+1)+(n+2)+...+m 求这个方程的十个解,分别按格式输出思路:化简一下就是 (2m+1)^2 - 8n^2 =1 刚好就是《数论及应用》这一章里的明显的佩尔方程(形如x^2-Dy^2=1)令x=2m+1 ,y=n,D=8那么 x(n)=x(n-1)*x1+D*y(n-1)*y1 y(n)=x(n-1)*y1+y(n-1)*x1目测最小解是x1原创 2015-01-10 21:43:52 · 516 阅读 · 0 评论 -
POJ 2262/ ZOJ 1951:Goldbach\'s Conjecture - 筛法打素数表
题意:一个偶数能不能表示为两个奇质数a跟b的和,如果能的话由于这个偶数可能可以表示为多个奇质数对的和,输出时只选取b-a最大的那对奇质数 选题原因:本题难度适中,是关于素数的问题,涉及的是素数表的构造,另外,本题很容易超时,要注意处理方法。 思路(描述参考http://blog.sina.com.cn/s/blog_63509b890100nsup.html):以空间换时间,利用筛选法求素数由于最原创 2015-01-10 21:43:56 · 604 阅读 · 0 评论 -
POJ 1284 : Primitive Roots - 欧拉函数,原根
题意:整数x是奇素数p的原根,当且仅当~~~blabla时叫做原根;给出一个奇素数p(3分析:这里需要应用到一个结论: p是素数,则p有phi(p-1)个原根。利用该结论知道,只要算出欧拉函数就行了。**拓展知识:在数论,特别是整除理论中,原根是一个很重要的概念。对于两个正整数(a,m) = 1,由欧拉定理可知,存在正整数, 比如说欧拉函数d = φ(m),即小于等于 m 的正整数中与 m 互质的原创 2015-01-10 21:44:17 · 664 阅读 · 0 评论 -
POJ 2417:Discrete Logging——Baby Step, Giant Step
题意:求最小的Y,满足XY mod Z = K高次同余方程,用hash做,套模板。。从网上找的模板与POJ 3243的区别在于:POJ 2417 保证P是素数且B POJ 3243 就没有这些好条件。这会导致麻烦,待会再说。一:#include #include #include #define maxn 65535 using namespace std; struct hash原创 2015-01-10 21:43:28 · 481 阅读 · 0 评论 -
POJ 2407 : Relatives - 欧拉函数
题意:给出一个正整数n,求小于n且与n互素的正整数有多少个分析:本题是简单的欧拉函数,直接套用《数论应用》里面,优化后的欧拉函数代码就好了。#include#include#includeusing namespace std;int phi(int n){ int rea=n,i; for(i=2;i*i if(n%i==0){ rea=rea-rea/i; while(n%i==0)原创 2015-01-10 21:44:13 · 907 阅读 · 0 评论 -
POJ 1023 : The Fun Number System - 二进制
题意:给予ppnnp...的字符串及长度k表示的二进制系统,其中k表示共有几位,p表示此位位权为正,n表示此位位权为负。如果最右面一位位p则位权为1即2^0若为n则为-1即-2^0(1 ≤ k ≤ 64,-2^63 ≤ N 方法:十进制转换成二进制的数学问题的变形,有规律可循,仔细研究会发现其中的递推关系。跟普通的二进制转换差不多,只要在该位为p时,余数为0或1,为n时余数为0或-1即可思路:从最原创 2015-01-10 21:43:34 · 543 阅读 · 0 评论 -
POJ 1079 : Ratio - 分数逼近
题意:题意一目了然吧~分母从1到max,进行逼近解法一:#include#include#includeusing namespace std;int main(){ int i,p,q,pt,a,b; while(~scanf("%d%d",&a,&b)){ p=1; q=0; for(i=1;i pt=(int)((double)(i*a)/(double)b+0.5); if(原创 2015-01-10 21:43:42 · 885 阅读 · 0 评论 -
BestCoder 2015百度之星资格赛1001大搬家 - 递推 组合数学
Problem Description近期B厂组织了一次大搬家,所有人都要按照指示换到指定的座位上。指示的内容是坐在位置i上的人要搬到位置j上。现在B厂有N个人,一对一到N个位置上。搬家之后也是一一对应的,改变的只有位次。在第一次搬家后,度度熊由于疏忽,又要求大家按照原指示进行了一次搬家。于是,机智的它想到:再按这个指示搬一次家不就可以恢复第一次搬家的样子了。于是,B厂史无前例的进行了原创 2015-05-25 13:17:31 · 794 阅读 · 0 评论