随笔分类 -  数论

摘要:赤裸裸的,直接贴代码。。不过注意题目要求X非负,所以最后还要再处理一下。。/* * hdu2669/win.cpp * Created on: 2012-7-6 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <queue>#include <s 阅读全文
posted @ 2012-07-06 15:01 moonbay 阅读(151) 评论(0) 推荐(0)
摘要:这题想了好久,代码也打了好久。挺不错的一道数论题。题目是要求两个集合(1...b, 1...d)中有多少对数的最大公约数为K,此问题等价于求两个集合(1...b/k,1...d/k)中有多少对数互质。不妨设b<d,则题目可以分为两部分求解,即:①(1...b)与(1...b)中有多少对数互质②(1...b)与(b+1...d)中有多少对数互质问题1就是欧拉函数的应用,就不详细说了。对于问题2,直接求不好求,我们倒过来想。对于(b+1...d)中的每一个y,要想知道(1...b)中有多少数与它互质,我们只需要知道多少个数与它不互质即可。而两个数不互质就意味着它们有公因子。对于每一个y的因子 阅读全文
posted @ 2011-12-11 14:35 moonbay 阅读(311) 评论(0) 推荐(0)
摘要:设(A/B)%9973=C,则A = 9973*k*B + B*C;得(B*C)%9973 = A % 9973;C一定存在且唯一,所以只要穷举一下就找出来了。/* * hdu1576/win.cpp * Created on: 2011-11-28 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algo 阅读全文
posted @ 2011-11-28 11:23 moonbay 阅读(171) 评论(0) 推荐(0)
摘要:刚做完一道推公式题,这题跟上一题解题思路很像。做完后上网搜索,发现有些人不是我这样做的,他们是发现了结果中有循环节,不过我还是觉得我的做法更巧妙。我的做法如下:首先推出公式f(n)=cell[(n+1)*(n+1)*(2n-1)/4];这里涉及浮点数向上取整问题,将会给取余操作带来很大的麻烦,于是分类讨论之,我们记g(n)=(n+1)*(n+1)*(2n-1)。显然,当n为奇数时,g(n)能被4整除当n为偶数时,我们将g(n)等价转换为:n*n*(2n-1)+4*n*n-1,于是结论就显然了,g(n)+1一定能被4整除,这正是结果向上取整后的结果。接下来就用我上一题的方法如法炮制就行了。/* 阅读全文
posted @ 2011-10-28 21:47 moonbay 阅读(245) 评论(0) 推荐(0)
摘要:题目蛮简单的,但是纠结了好久。原因倒不是推不出公式,而是推出公式以后不好办,因为公式是(n+2)*(n+1)*n/6,而n最大为10000000,这样的话即使用long long 也存不下。记得同余公式里关于除法的好像只有逆元的一些,上网找了一下,确定没有。于是只有自己继续推了。最后,自己终于证明了如下公式:不妨设a > b,r为a、b的公约数,则有(a/r)%(b/r) = (a%b)/r。不知道这个公式之前有没有人推出来过,反正自己挺有成就感的。其实也很好证明,如下:设(a/r)%(b/r) = z,则一定有且仅有一个k满足(a/r) = k(b/r) + z。从而得a = kb + 阅读全文
posted @ 2011-10-28 20:55 moonbay 阅读(191) 评论(0) 推荐(0)
摘要:这题比较好,考查了数论的许多知识,包括一个数所有因子的和的形式,以及同余公式(除法的同余公式,即求同余下的逆元)等,网上好多讨论的,这里就不再啰嗦了,直接贴代码。/* * hdu1452/win.cpp * Created on: 2011-10-24 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <alg 阅读全文
posted @ 2011-10-24 19:40 moonbay 阅读(224) 评论(0) 推荐(0)
摘要:基本性质:(1)若p|(a-b),则a≡b (% p)。例如 11 ≡ 4 (% 7), 18 ≡ 4(% 7)(2)(a % p)=(b % p)意味a≡b (% p)(3)对称性:a≡b (% p)等价于b≡a (% p)(4)传递性:若a≡b (% p)且b≡c (% p) ,则a≡c (% p)运算规则:模运算与基本四则运算有些相似,但是除法例外。其规则如下: (a + b) % p = (a % p + b % p) % p (1) (a - b) % p = (a % p - b % p) % p (2) ... 阅读全文
posted @ 2011-10-24 19:19 moonbay 阅读(320) 评论(0) 推荐(0)
摘要:好题啊,赞一个~先是没思路,问了别人,才知道只要令x = n + a, y = n + b因为x 和y 一定大于n(这个很好想),就能将问题转化为求n*n = a * b以a和b为变量的方程的解的个数,而这个方程解的个数正好可以用n*n这个数的所有因子个数(设为num)来表示,即(num + 1) / 2。想到这还卡了一会儿,因为这个也不好求,n*n就成了long long 范围了。花了好久才想到,只要能够求出n的各个素因子的个数,n*n的素因子个数只是翻倍而已。从而,就可以用打素数表的方法(这里也有一个小技巧,只要打到根号n的素数表即可,因为n*n的素因子中,如果有大于根号n的,那么一定只有 阅读全文
posted @ 2011-10-16 23:03 moonbay 阅读(161) 评论(0) 推荐(0)
摘要:欧拉函数的应用。/* * hdu1286/linux.cpp * Created on: 2011-9-1 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>using namespace std;void work();int main() {#ifndef ONLINE_JUDGE freopen("data.in", "r", s 阅读全文
posted @ 2011-09-01 08:24 moonbay 阅读(149) 评论(0) 推荐(0)
摘要:/* * hdu2588/linux.c * Created on: 2011-8-2 * Author : ben */#include <stdio.h>#include <math.h>int phi(int x) { int i, res = x, temp = (int) sqrt(x); for (i = 2; i < temp + 1; i++) { if (x % i == 0) { res = res / i * (i - 1); while (x % i == 0) { x /= i; } } } if (x > 1) { res = r 阅读全文
posted @ 2011-08-02 11:56 moonbay 阅读(214) 评论(0) 推荐(0)