数论
东さん
无知而狂妄
展开
-
POJ - 2262 - Goldbach's Conjecture(筛选素数)
给出一个数字,然后用两个素数的和来表示这个数n;先筛选素数,打表,然后遍历,从3开始,每次加2,因为偶数一定不是素数;然后用n减去i,去判定是不是素数,不需要枚举;#include<iostream>#include<cstring>#include<cmath>#define MAXN 1000005using namespace std;bool isprime[MAXN];void ch原创 2017-09-23 21:19:27 · 236 阅读 · 0 评论 -
UVA - 1636 - Headshot(统计字符 + 概率)
左轮手枪里装着子弹,开了第一枪是空枪,没有子弹,如果转一下左轮,然后再射击,问是射出子弹的概率大还是没有的大还是一样,分别输出”SHOOT “,”ROTATE”,”EQUAL”; 给出一个数字串表示子弹的有无,这是一道概率题,有个小问题,就是自弹弹堂是连续的,明白了这个就好做了; 首先这是一个条件概率,如果下一次射击是有子弹的,那么我们只需要找01的序列就可以了,同样,没有射出子弹的情况是00的原创 2017-10-01 11:18:02 · 255 阅读 · 0 评论 -
POJ 1284 - Primitive Roots (原根 + 欧拉函数)
题意:求一个数的原根数; 设g是P的一个原根,那么 gig^{i} mod P 结果两两不同, 1 < g < P,0 < i < P(i最大取P-1) 就是说g是遍历出来的,次方数从小到大挨个判断,如果结果两两不同的话,就是一个原根。我们使用欧拉定理,x的原根数恰好为x-1的欧拉函数的值//欧拉函数int euler_phi(int n) { int m = (int)sqrt(n原创 2017-09-29 08:52:56 · 543 阅读 · 0 评论 -
UVa12716 - GCD XOR
输入一个整数,有多少对(a,b)满足1<=b<=a<=n,且 gcd(a,b) = a xor b gcd是最大公约数 xor 是 异或运算,2进制 1001^1011=0010 相同为0,不同为1设gcd(a,b) = a xor b = c 打印一些满足条件的a,b,c,然后发现c = a - b有了这个规律就大大节约了时间,遍历a和c,用a-c表示b 在遍历的时候,因为c是a的最原创 2017-09-22 09:21:34 · 321 阅读 · 0 评论 -
UVa10791 - Minimum Sum LCM (分解因数)
输入n,求两个正整数,是他们的最小公倍数为n,并且是其中最小的一组,输出他们的和。唯一分解定理 nn=ap1a^{p1} * bp2b^{p2} * cp3c^{p3}…… 任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积例如 36 = 2 * 2 * 3 * 3 如果两个数最小公倍数是36,那么这两个数必须互质,像6 * 6就是不符合规定的,因为最小公倍数为6,原创 2017-09-22 08:47:31 · 220 阅读 · 0 评论 -
UVA - 10699 - Count the factors(分解素因数)
给出一个很大的数,然后判断素因数的个数,我们先打一个素数数组,里面全存的是素数; 然后注意判断是否可以被整除,如果可以就一口气除到不能除尽为止,然后换下一个素数,继续上述操作;#include<iostream>#include<cstring>#include<cmath>#define MAXN 1000005#define ll long long using namespace s原创 2017-09-30 11:38:41 · 231 阅读 · 0 评论 -
UVA - 10924 - Prime Words (素数)
输入一个由大小写字母组成的字符串,每个字符代表着不同的数字,计算出这个字符串的数值,判断是否是素数; 首先我们打个素数表; 然后利用ascll码存入数组中,然后判断就ok了还有一点!!!这个题中 1 算素数!!!wr无数次,还是读题不仔细#include<iostream>#include<cstring>#include<cmath>#define MAXN 30using namesp原创 2017-09-30 11:31:23 · 492 阅读 · 0 评论 -
UVA - 10394 - Twin Primes(素数对)
定义了一个素数对的概念,就是如果p是素数的话,p+2也是素数的话,那么(p,p+2)就是一组素数对; 那么我们在打素数表的时候,顺便判断i-2是否是素数即可;#include<iostream>#include<cstring>#include<cmath>#define ll unsigned long long //数据太大,这个比long long还大#define MAXN 100原创 2017-09-30 11:20:13 · 361 阅读 · 0 评论 -
UVA - 10789 - Prime Frequency(素数打表)
题意是给出0-9,A-Z,a-z,组成的字符串,如果字符的个数是素数就输出这个字符。 例如ABCC中的C的个数是素数,那么输出C; 首先素数打表,剩下的就是如何储存每个字符的个数了,我们可以利用ascll码。 每个字母有不同的ascll码,我们让每个字符减去0的ascll码,为什么是0呢,因为最小的ascll就是0,这样数组就是从0开始的(‘0’-‘0’= 0),这样可以减少数组的大小,节约内原创 2017-09-30 11:11:36 · 282 阅读 · 0 评论 -
UVa11582 - Colossal Fibonacci Numbers! (快速幂 取模)
输入两个非负数 a,b,和正整数n,计算f(a^b)除以n的余数; f(i+2) = f(i+1) + f(i); 函数f里是一个斐波那契数, 所以需要打表,但是由于数据太大,只能取模后存储 因为每次n都不一样,所以每次都需要重新打表。先说打表: 当取完模后,数字都是在0到n-1徘徊,当连续两个数字与开头两个数字一样的时候,就开始了循环,(规律),例如n=3的时候,前10项为1,1,2,0,原创 2017-09-21 14:51:27 · 250 阅读 · 0 评论 -
POJ - 2407 - Relatives(欧拉函数 + 约数个数定理)
求出比n小,且与n互素数的个数;模板题,对于一个大于1正整数n可以分解质因数: 则n的正约数的个数就是 其中a1、a2、a3…ak是p1、p2、p3,…pk的指数。 化简后:然后用程序表达后就是:int phi[MAXN];int euler_phi(int n) { int m = (int)sqrt(n + 0.5);//防止数据偏小 int ans = n; for原创 2017-09-23 21:38:27 · 356 阅读 · 0 评论 -
POJ - 3518 - Prime Gap(筛素数)
给出一个数字n,求n所在得一个区间的长度,区间是最近的两个素数为边界;那么n如果为素数的话,那么直接输出0;先打表,因为用的是前10万个素数,所以在打表的时候,记录素数的个数;以n点为中心向两边判定,一定要先判定再加减;#include<iostream>#include<cstring>#include<cmath>#define ll long long#define MAXN 1000原创 2017-09-23 21:26:51 · 327 阅读 · 0 评论 -
POJ - 1061 - 青蛙的约会
首先要知道扩展欧几里得,说白了就是解二元一次方乘,二元一次的话肯定有多解,看题目要求求出最优解。 设一共跳了t次(x + m*t) % l = (y + n*t)可以化简为:(m - n)*t % l = y - x设取余的时候去掉了k个l,那么可以化简为:(m - n)*t + l*k = y - x显然这是一个方乘 然后套用扩展欧几里得int extgcd(int a, int b, int原创 2017-10-03 10:09:03 · 192 阅读 · 0 评论