数论
ConwayTian
一切再来,为时未晚。
毁掉你人生的,其实是你内心的平庸,是你失去追求卓越的那个瞬间。
展开
-
欧拉函数
来自http://www.cnblogs.com/DreamUp/archive/2010/07/24/1784116.html欧拉函数在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's t转载 2011-09-05 21:46:36 · 944 阅读 · 0 评论 -
POJ 2429 GCD & LCM Inverse (整数分解,由gcd+lcm求a,b)
题意:给你两个数a,b的最大公约数和最小公倍数,求a,b。(有多组a,b的情况下取a+b最小的)题解:令 c = a * b / gcd(a,b),对 c 因式分解假如c = p1^k1 * p2^k2 * p3^k3令 d1 = p1^k1, d2 = p2^k2, d3 = p3^k3然后从d1,d2,d3中选取某几项,使得它们的积 s 最接近sqrt(c),且那么 a =原创 2012-02-26 17:14:30 · 3709 阅读 · 0 评论 -
POJ 1006 Biorhythms 中国剩余定理/扩展欧几里得
先看视频:http://v.youku.com/v_show/id_XMTExNTAzOTIw.html #includeint main(){ int p, e, i, d; int num, cnt = 1; while ( scanf("%d%d%d%d",&p,&e,&i,&d) ) { if ( d == -1 ) break原创 2012-02-17 23:38:39 · 542 阅读 · 0 评论 -
POJ 1061 青蛙的约会 扩展欧几里得
青蛙的约会Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 67617 Accepted: 10832Description两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到原创 2012-02-18 18:29:44 · 501 阅读 · 0 评论 -
POJ 2142 The Balance 扩展欧几里得,求|x|+|y|最小
题解:先做出两个函数的图像,然后求|x|+|y|的最小值。|x|+|y|=|x0+b/d *t |+|y0-a/d *t| 这个关于t的函数的最小值应该在t零点附近(在斜率大的那条折线的零点附近,可以观察出来)。以下三种情况中,函数最小值都应该出现在B点附近。#include#includeusing std::swap;int Egcd ( int a, int原创 2012-02-18 18:56:56 · 778 阅读 · 0 评论 -
POJ 2115 C Looooops 模线性方程(扩展欧几里得)
题解:转换一下。和青蛙那题差不多。#include#includeusing namespace std;__int64 Egcd ( __int64 a, __int64 b, __int64 &x, __int64 &y ){ __int64 tmp, ret; if ( b == 0 ) { x = 1, b = 0; return a; } ret = Eg原创 2012-02-18 20:46:49 · 782 阅读 · 0 评论 -
POJ 2909 Goldbach's Conjecture (求x=p1+p2)
题意:哥德巴赫猜想。任意一个>=4的偶数可以写成两个素数之和。即x=p1+p2。给出一个x,求p1,p2的对数。#include#include#includeusing namespace std;#define MAX 32768int p[MAX], a[MAX], pn;void prime (){ int i, j; pn = 0; memset(a原创 2012-02-25 16:47:53 · 881 阅读 · 0 评论 -
POJ 2992 Divisors 求一个数的因数的个数
题意:输入C(n,k), 求该数的因数个数。题解:对于任意质数p, n!中有(n/p+n/p^2+n/p^3+...)个质因子p。#include#include#includeusing namespace std;const int MAX = 450;int a[MAX], p[MAX], pn;void prime (){ pn = 0原创 2012-02-29 21:01:13 · 1883 阅读 · 0 评论 -
POJ 1809 Regetni 奇偶性
题意:给你许n个点,可以从中任选三个点组成一个三角形。问这些三角形中面积为整数的有多少(包括0)。题中给出一个面积公式:A=|x1y2 - y1x2 + x2y3 - y2x3 + x3y1 - y3x1|/2 题解:本质上我们只要让x1y2 ,y1x2 , x2y3,y2x3, x3y1 ,y3x1这六项中奇数项的个数为偶数个,即0,2,4,6。所以我们把点分类:奇奇,偶偶,奇偶原创 2012-03-24 17:22:08 · 1250 阅读 · 0 评论 -
POJ 1284 Primitive Roots (原根,欧拉函数)
转自:http://www.cnblogs.com/ACShiryu/archive/2011/08/06/poj1284.html/**************************************************************************************************/题意:就是给出一个奇素数,求出他的原根的个数。定义:原创 2012-02-26 20:56:50 · 3230 阅读 · 0 评论 -
POJ 2047 Relatives 欧拉函数
#include#include#include#include#include#includeusing namespace std;#define lint __int64lint Euler ( lint n ){ lint i, ret = n; for ( i = 2; i * i <= n; i++ ) { if ( n %原创 2012-02-26 21:08:31 · 722 阅读 · 0 评论 -
POJ 2773 Happy 2006 欧拉函数的应用
题意:输入两个数m,k。求与m互素的第k个数。题解:我们知道,如果a和m互素,那么k*m+a与m互素。也就是说【1,m-1】,与【k*m+1,k*m+m-1】区间存在一个对应关系:【1,m-1】中与m互素的个数 = 【k*m+1,k*m+m-1】中与m互素的个数。另外,值得注意的是,我们在求欧拉函数的过程中实际上求出了m所有的素因子,既然如此,就可以通过筛选法筛掉所有与m不互素的数。原创 2012-02-27 17:23:14 · 826 阅读 · 0 评论 -
POJ 2478 Farey Sequence 快速求欧拉函数/法雷级数
题解:E(x)表示比x小的且与x互质的正整数的个数。1.若p是素数,E(p)=p-1。2.E(p^k)=p^k-p^(k-1)=(p-1)*P^(k-1)证:令n=p^k,小于n的正整数数共有n-1即(p^k-1)个,其中与p不质的数共[p^(k-1)-1]个(分别为1*p,2*p,3*p...p(p^(k-1)-1))。所以E(p^k)=(p^k-1)-(p^(k-1)-原创 2012-02-27 21:02:48 · 1148 阅读 · 0 评论 -
POJ 3358 Period of an Infinite Binary Expansion 欧拉函数+欧拉定理
题意:输入一个有理数p/q(保证是一个小数),然后将其小数部分用二进制表示。求出在此种表示下的循环起点和循环节长度{x} = 0.a1a2...ar(ar+1ar+2...ar+s)w题解:来自Discuss我们可以观察一下1/10这组数据,按照二进制转换法(乘二法),我们可以得到:1/10 2/10 4/10 8/10 16/10 32/10 ...然后都分子都尽可能减去1原创 2012-02-28 23:36:03 · 1505 阅读 · 0 评论 -
POJ 2417 Discrete Logging 离散对数/BabyStep_GiantStep
题意:BL == N (mod P),并且p是素数题解:#include#include#includeusing namespace std;#define lint __int64#define MAXN 131071struct HashNode { lint data, id, next; };HashNode hash[MAXN<<1];bool flag原创 2012-03-14 22:36:04 · 1417 阅读 · 0 评论 -
POJ 3243 Clever Y 求A^X = B (mod C) / BabyStep_GiantStep
题意:求最小的x使得A^X = B (mod C)题解:【扩展Baby Step Giant Step解决离散对数问题】作者 AekdyCoin !【普通Baby Step Giant Step】【问题模型】求解A^x = B (mod C) 中 0 【思路】我们可以做一个等价x = i * m + j ( 0 而这么分原创 2012-03-14 21:26:00 · 4103 阅读 · 0 评论 -
1251 - zlly长了一张包子脸
1251 - zlly长了一张包子脸Time Limit: 1000 msMemory Limit: 65535 KbDescriptionzlly长了一张包子脸,他特别喜欢吃糖果,现在他手头有若干种糖果,每种糖果有个口味值,每种糖果有无数多个。然后娄童鞋也非常喜欢吃糖果,他的口味特别广泛,他喜欢各种各样的口味值,他要求zlly用现有的口味值拼出新的口味值。现在,娄童鞋想知道他不能原创 2011-11-02 15:07:35 · 1069 阅读 · 0 评论 -
POJ 1845 Sumdiv 快速求幂+同余+乘法逆元
题意:给定A, B,求A^B的所有因数之和,并模9901。题解:1: 对A进行素因子分解得 A = p1^a1 * p2^a2 * p3^a3 *...* pn^an. 故 A^B = p1^(a1*B) * p2^(a2*B) *...* pn^(an*B);2:A^B的所有约数之和为: sum = [1+p1+p1^2+...+p1^(a1*B原创 2012-03-15 21:03:30 · 1802 阅读 · 0 评论 -
POJ 1730 Perfect Pth Powers (求最大p,x=b^p)
题意:求最大的P值,使得x=b^p。b可以为任意值。需要注意的是x有可能为负数,题中“ magnitude at least 2”应该指的是|X|>=2.题解:sqrt(2^32) = 65536,可以事先求出这个范围内的所有素数。然后在素数中找出x的因素,x=(p1^k1)*(p2^k2)*(p3^k3)*(p4^k4)····。最后对k1,k2···求一次最大公约数。若x#includ原创 2012-02-25 16:25:35 · 1190 阅读 · 0 评论 -
POJ 1604 Just the Facts 阶乘最后非0位
#includeint get2 ( int n ){ if ( n == 0 ) return 0; return n/2 + get2(n/2);}int get5 ( int n ){ if ( n == 0 ) return 0; return n/5 + get5(n/5);}int g ( int n,原创 2012-02-16 20:21:38 · 907 阅读 · 0 评论 -
POJ 1150 The Last Non-zero Digit 阶乘最后非0位
转自:http://www.cppblog.com/abilitytao/archive/2009/10/31/99907.html这个题怎么来做呢?先别急,我们先来讨论一下下面几个子问题:1.如何求出n阶乘中质因数x(比如说5)出现的次数?比如说15的阶乘 :1*2*3*4*5*6*7*8*9*10*11*12*13*14*15由于5这个质因数只在5的倍数里面才出现,所以我从转载 2012-02-16 20:11:11 · 2162 阅读 · 0 评论 -
POJ 2262 Goldbach's Conjecture 数论
题意:哥德巴赫猜想:任何两个大于4的偶数都等于两个奇素数之和。输入n, 求 n = a + b, a, b 为奇素数, 若不存在这样的a, b,输出Goldbach's conjecture is wrong。#include #include using namespa原创 2011-09-09 20:45:12 · 513 阅读 · 0 评论 -
POJ 2739 Sum of Consecutive Prime Numbers 数论
题意:给定一个数值,判断他是否等于一连串素数之和(这些素数必须是连续的)。输出满足条件的组合的个数。题解:预先求出连续的素数和。然后找到不大于n的最大素数,那么所有的组合(连续不断的素数)只可能在此范围内。#include #include using namespa原创 2011-09-09 21:21:06 · 703 阅读 · 0 评论 -
POJ 3006 Dirichlet's Theorem on Arithmetic Progressions 素数
题意:给出一列等差数列。等差数列的起点a与公差d互素。求数列的第n个素数。#include #include using namespace std;int Prime[1000000];int main(){ int i, j; memset(Prime原创 2011-09-09 17:27:31 · 566 阅读 · 0 评论 -
POJ 1503 Integer Inquiry 高精度加法
题意:输入若干个大整数,求其和。#include #include using namespace std;int sum[111];char str[101];int main(){ int i, j, len; while ( cin >> str原创 2011-09-09 17:33:19 · 523 阅读 · 0 评论 -
POJ 2109 Power of Cryptography 数论
题意:求 k,令 k 的 n 次方和 p 相等。题解:偷了下懒。 不过高精度还得再熟悉下,有空就系统补做一下吧。不过c++中类型的有效范围还是得记着:类型 长度 有效数字 绝对值范围float原创 2011-09-09 22:20:03 · 385 阅读 · 0 评论 -
POJ 2602 Superlong sums 大整数求和
题意:大整数相加。#include int array[1000002];int main(){ __int64 n, i; char a, b; int carry = 0; scanf( "%I64d", &n ); getchar(); for ( i = 0; i < n; i++ ) { a = getchar();getch原创 2011-09-10 00:57:30 · 983 阅读 · 0 评论 -
POJ 2891 模线性方程组(mi mj 不互素)
题解:x = ai ( mod mi ) 1 先考虑k==2的情况:x = a1 ( mod m1 )x = a2 ( mod m2 )方程组有解的充分必要条件是: d | (a1-a2) ,其中 d = (m1,m2)证明如下:必要性: 设 x 是上面同余方程组的解,从而存在整数q1,q2使得x=a1+m1*q1,x=a2+m2*q2,消去x即得a1-a2 = m2原创 2012-02-21 21:28:12 · 1341 阅读 · 0 评论 -
POJ 2034 Anti-prime Sequences
题意:输入m, n, d。求出m,m+1,m+2,````m+n的一个排列。使得任意的连续k个数之和都为合数,2题解:暴力,依次枚举第一个数,第二个数····,第n-m+1个数。#include#include#includeusing namespace std;const int N = 1005;bool p[N*10], used[N]; // p[0] = fal原创 2012-02-23 12:35:49 · 1709 阅读 · 1 评论 -
POJ 1365 Prime Land 整数分解
题解:在求素数的过程中记录下每个数的最小因素,a[n]表示n的最小因素,例如a[2]=2, a[12] = 3, a[16] = 2······#include#include#include#includeusing namespace std;const int MAX = 33333;int a[MAX], p[MAX];int r, pn;struct Resu原创 2012-02-22 23:20:06 · 721 阅读 · 0 评论 -
POJ 3641 Pseudoprime numbers 伪素数测试
题意:判断一个数是否是基于a的伪素数。只有当p是合数且a^p = a ( mod p ) 时,才输出yes。题解:Miller_Rabin素数测试。#include#include#includeusing namespace std;#define lint __int64lint modular_exponent ( lint a, lint b, lint n ){原创 2012-02-23 19:12:39 · 903 阅读 · 0 评论 -
POJ 2191 各种素数算法
来自Discuss.分析:首先打出63以内的素数prime[i...n],之后利用miller_rabin素数测试法测试2^prime[i]-1是否为素数(可打表或不,不怎么影响)。如果不是则利用Pollard对该数进行质因子分解。 对于miller_rabin素数测试法和Pollard整数质因子分解数论方面的书都有,几乎是模板。code:2191 Accepted 172K 16MS转载 2012-02-23 20:42:59 · 1083 阅读 · 0 评论 -
POJ 3518 Prime Gap 素数
#include#includeusing namespace std;const int MAX = 1299710;int p[MAX], a[MAX], pn;;void prime (){ int i, j; pn = 0; memset(a,0,sizeof(a)); for ( i = 2; i < MAX; i++ ) {原创 2012-02-23 16:13:34 · 892 阅读 · 0 评论 -
POJ 1095 Prime Cuts 素数
题解:#include#includeusing namespace std;const int MAX = 2000;int p[MAX], a[MAX], pn;;void prime (){ int i, j; memset(a,0,sizeof(a)); p[1] = 1; pn = 1; for ( i = 2; i < MAX; i+原创 2012-02-23 18:17:13 · 646 阅读 · 0 评论 -
POJ 2191 Mersenne Composite Numbers 整数分解
题意:分解2^K次方以内的梅森复合数。#include#include#include#include#include#includeusing namespace std;#define lint __int64lint ans[65];int p[65], cnt;lint gcd ( lint a, lint b ){ while ( b != 0 )原创 2012-02-24 22:03:27 · 1159 阅读 · 0 评论 -
POJ 2689 Prime Distance (筛选法平移)
题意:给定一个范围,求此范围内任意两个相邻素数的差值,输出最大值和最小值。题解:1 = 1000000 在空间限制的条件下,可以先将[ L, U ] 平移到 [ 0, U-L+1 ]。然后用筛选法做。注意:筛选的时候由于1不是任何素数的倍数,所以需要特殊处理。#include#include#includeusing namespace std;const int MAX =原创 2012-02-25 20:18:11 · 954 阅读 · 1 评论 -
POJ 1811 Prime Test 素数测试
#include#include#include#include#include#includeusing namespace std;#define lint __int64lint ans;lint gcd(lint a,lint b){ if ( b == 0 ) return a; return gcd ( b, a % b );}原创 2012-02-26 00:03:20 · 728 阅读 · 0 评论 -
A*B mod C的计算方法
A*B mod C的计算方法方法一:大家都能想到,计算A*B的值,然后在计算A*B mod C的值。这是最简单的,但是这个有个弊端,即a*b的值不能太大,太大可能溢出。方法二:回顾进制转换的知识,二进制转换为10进制可以以2的权值相加(貌似是这样描述的)。比如13=(1101)2=1*2^3+1*2^2+0*2^1+1*2^0。同样的,当我们计算A*转载 2013-03-23 13:43:42 · 4929 阅读 · 0 评论