![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM_数论
文章平均质量分 68
xcszbdnl
这个作者很懒,什么都没留下…
展开
-
poj1061欧几里德算法
有三个算法:一是著名很简单的gcd算法其关键在于证明gcd(a, b) == gcd(b, a mod b)利用整除性来证明,即gcd(a , b) 整除 gcd(b, a mod b),而gcd(b, a mod b)整除gcd(a ,b)设d = gcd(a , b),a mod b = a - (a / b ) * b,所以d可以整除a mod b, d可以整除b,所以d可以整除原创 2013-04-10 23:35:58 · 643 阅读 · 0 评论 -
ural 1803
求Fibonacci的第n项K进制表示后各个位的和。采用压缩的方式,原创 2014-08-10 00:13:15 · 514 阅读 · 0 评论 -
codeforces_351b
好吧。。比赛的时候没有做出来。主要是只考虑了所有整数都取向下的情景,没有考虑到所有整数都往上取。首先区分出整数和小数,整数的差是没有影响的,主要在于小数的差。先把所有小数的和求出来。因为取上为n个,取下为n个。对于所有小数来说哪一个小数取上和哪一个小数取下是没有区别的。假设0.3 0.5 0.7 0.8 ...假设里面有2个可以取上,2个可以取下。无论是哪2个取上取下最后一定是0原创 2013-10-05 23:54:31 · 762 阅读 · 0 评论 -
codeforces_346a
从一个集合里面选两个数,x,y 把|x - y|的绝对值加进去,如果|x-y|的绝对值不能被加进去的话那个人就输了。找到所有数的最大公约数,设为k那么所有数就可以表示成为a1 * k,a2 * k,a3 * k....an * k.(假设an最大)所以加进去的数一定是m * k (1 所以看1,an有多少个数,如果有奇数个就一定是Alice赢,否则BobAC代码:#in原创 2013-09-21 15:18:59 · 636 阅读 · 0 评论 -
uva11069
找一个1-n的子集,满足两个条件(1)任何数不能相差1(2)向其中插入不存在其中的1-n的数一定会存在一个数和其相差1.用递归来统计。f[i]表明选用了1-i个数中最后一个数。那么f[i] = f[i - 3] + f[i - 2],因为选了i一定就要么选i - 2,要么选i - 3最终答案是f[n] + f[n - 1]AC代码:#include #原创 2013-09-18 14:38:31 · 715 阅读 · 0 评论 -
codeforces_330c
木有做出来,发现是在求组合数模的时候求错了。今后涉及取模运算除法的应该把其逆求出来,而不应该直接拿出来除之后再去求逆。AC代码:#include #include #include using namespace std;const int MAX_NUMBER = 1000007;const long long MOD_NUMBER = 1000000007; lo原创 2013-09-14 19:31:17 · 620 阅读 · 0 评论 -
sgu491
求满足ax + by = n,(x >= 1, y >= 1)的a,b有多少个。比赛时候没有做出来,是因为想到只知道n,要求a,b,x,y枚举的话4个铁定超时如这类找满足条件个数的,如果不能暴力枚举的话都要尽量去转化成为求因子个数。转化成n - ax = by,枚举a,x,那么b的个数就相当于n - ax中的因子个数,依次检查每个因子,要比a大,然后去重统计。#include #原创 2013-08-15 22:46:02 · 509 阅读 · 0 评论 -
ural 1860
求f[i]的不同因子数。f[i] = i * f[i - 1] * f[i - 2],f[1] = 1, f[0] = 1类似斐波拉契数要想到斐波拉契数列。f[2] = 2f[3] = 2 * 3f[4] = 2 * 2 * 3 * 4f[5] = 2 * 2 * 2 * 3 * 3 * 4 * 5所以f[i]中k的个数和斐波拉契数有关。个数为fi[n - k],因为n的个原创 2013-08-23 22:48:21 · 673 阅读 · 0 评论 -
codeforces 336c
一开始想错了。想到要被2^k整除,那么找到最大的lowbit(x)即可。但是也有可能实际答案比lowbit还要大。所以应该直接枚举k,然后看是否有和2^k - 1一系列与之后为0的,如果有的话说明k满足,k从大到小枚举即可。AC代码:#include #include const int MAX_NUMBER = 100006;int value[MAX_NUMBE原创 2013-08-10 23:27:23 · 728 阅读 · 0 评论 -
hdu4196
从1-n里面选数,数的乘积要求是完全平方,求这个乘积的最大值,要求mod 1000000007对n!进行素因子分解,如果素因子是奇数的话,要变成偶数,也就是n!要除以该素因子。否则的话就保留该素因子。首先筛素数,然后对n!进行素因子计算。把要除的积保存在一个数里面。最后求n! / 该数,也就是对该数关于mod_number的逆,mod_number = 100000007为素数,就相当原创 2013-08-08 21:00:11 · 615 阅读 · 0 评论 -
LA5900
求满足C(n,k) = x的数目,x高达10^15直接枚举是不可能的,因为x高达10^15,一定有C(x, 1) = x;那么为了降低枚举的数目,可以从k考虑。当k = 1, k = 2, k = 3的时候如果有满足的可以把n直接算出来。如果没有满足的,当k从4开始的时候,那么至少是n * (n - 1) * (n - 2) * (n - 3) / 16 = x了。那么n只要枚原创 2013-08-06 23:29:38 · 442 阅读 · 0 评论 -
poj2689
如何在区间范围以内筛选素数。#include #include #include const int MAX_LENGTH = 1000006;const int MAX_PRIME = 50000;bool vis[MAX_PRIME + 2];bool is_prime[MAX_LENGTH];int prime[MAX_PRIME];int prime_number;原创 2013-08-04 22:26:00 · 710 阅读 · 0 评论 -
uva11426
可以化成简单的s[n] = s[n - 1] + f[n]关键在于求f[n] = gcd(1, n) + gcd(2, n) + ... + gcd(n - 1, n)直接裸求的话肯定会超时。可以把上面的和按和n的约数来分类。约数为1,2,3... 那么结果就为sums{i * g(i, n)};g(i, n)表示和n约数为i的数的个数、相当于求gcd(x / i, n /i)原创 2013-07-28 15:06:25 · 951 阅读 · 0 评论 -
poj1730
好吧,这次被负数给卡死了。以及一开始思想的错误,找到最大的p使b^p = x;先对x进行质因数分解,因为x 不一定要所有因子的次数都相同,只要求出所以因子的最大公约数就可以得到p。但是当x时负数的时候,只能是奇数次方,所以要将p一直除到为奇数为止。AC代码:#include #include #include const int MAX_NUMBER = 100000;原创 2013-08-01 18:19:19 · 780 阅读 · 0 评论 -
poj3126
好吧,本来是一个很简单的bfs,还被自己写这么复杂,先打素数表,然后建立转移图,后面想如何求点对距离,还用了floyd;其实好水的题目,直接bfs即可。。AC代码:#include #include #include const int MAX_NUMBER = 10000;bool vis[MAX_NUMBER + 5], is_prime[MAX_NUMBER + 5]原创 2013-07-31 17:20:34 · 638 阅读 · 0 评论 -
hdu 4937
想到一个数一定是由a1 * x ^ 0 + a2 * x ^ 1 + ... an * x ^ n原创 2014-08-12 18:49:50 · 497 阅读 · 0 评论