数论
文章平均质量分 50
无敌大饺子
这个作者很懒,什么都没留下…
展开
-
ZOJ 2545 Factstone Benchmark
求最大的n 满足n! 2 ^ k 不会太大,所以可以直接暴力上去.设2 ^ k 为p 则有:n! log2(n!) log(n!) log2(1) + log(2) + log(3) .... + log2(n) #include #include #include using namespace std;int y;int main(){ while (sca原创 2013-05-07 14:05:34 · 518 阅读 · 0 评论 -
UVA 10791 - Minimum Sum LCM
分解素因子题解这篇写的非常好:http://www.cnblogs.com/scau20110726/archive/2013/01/18/2866101.html#include #include #include using namespace std;const int MAX = 1000001;long long fac[100];bool is_prime[MAX]原创 2014-03-07 15:38:31 · 469 阅读 · 0 评论 -
UVA 11029 - Leading and Trailing
求n^k的前3位和后3位.后三位:通过快速幂取模求得.前三位:将n^k转换成10^(k*log10(n)),用fmod求得k*log10(n)的小数部分t, 10^(t)的整数部分就是第一位, 10^(2 + t)的整数部分自然就是前三位了.#include #include #include #include #include using namespace std;l原创 2014-03-08 12:17:19 · 537 阅读 · 0 评论 -
UVA 10820 - Send a Table
求1-n之间互质的对数.首先打表求出欧拉函数的值,然后直接累加1-n的欧拉函数值*2就是答案,注意n=1的时候要特判下.#include using namespace std;const int MAX = 50001;int phi[MAX];int generate_phi(){ for(int i = 0; i < MAX; ++i)phi[i] = 0; phi[原创 2014-03-07 19:13:35 · 443 阅读 · 0 评论 -
HDU 1695 GCD(欧拉函数+容斥原理)
求[1..b]中的x和[1..d]中的y有多少gcd(x,y) = k.要求gcd(x,y) = k,则等价于求 gcd(x/k,y/k) = 1.所以问题转化成求[1..b/k]和[1..d/k]中有多少对gcd(x,y) = 1.进一步转换成 枚举[1,d]区间里的n与][1, b]的区间的数互质的个数,这里d>=b.因为[1,b]包含在[1,d]里,所以[1,b]相当于累加欧原创 2014-03-09 13:40:30 · 765 阅读 · 0 评论 -
HDU1787 GCD Again(容斥原理)
和1695类似的题目,只不过这次求的是不互质数的个数.#include #include #include #include using namespace std;const int MAX = 1000005;bool is_prime[MAX];int prime[MAX / 10], prime_idx;void init_prime(){ memset(is_pr原创 2014-03-09 21:52:13 · 429 阅读 · 0 评论 -
HDU 1788 Chinese remainder theorem again
题目介绍了一大堆中国剩余定理的东西,其实没有用到.求N,满足N%Mi = Mi - a.也就是(N + a) % Mi = 0,那么只要求出Mi的最小公倍数再减一个a那么就是答案了.注意用long long.#include using namespace std;long long gcd(long long a, long long b){ return !b ? a原创 2014-03-10 09:39:05 · 579 阅读 · 0 评论 -
HDU 4135 Co-prime
和1695题类似的题目,不过简单点.求区间[A,B]里和N互质的数的个数,那么可以通过容斥原理求出[1, r] 区间里和N互质的数的个数.容斥原理的方法和1695题的方法类似,这里给上链接1695.答案自然就是[1, B] - [1, A].#include #include #include using namespace std;const int MAX = 1000001;原创 2014-03-09 14:41:16 · 491 阅读 · 0 评论 -
Codeforces 385C Bear and Prime Numbers(素数打表,二分)
题意:给出n个数,m次查询,每次查询一个区间[l,r],求n个数中是区间[l,r]之间素数倍数的个数和,每个素数都要算一次和.解法:由于Xi最大为10^7,所以可以开一个这么大的数组,用筛选法求出素数和对应的和,最后查询的时候二分找素数位置.#include #include #include using namespace std;const int MAX = 10000001原创 2014-04-07 10:24:28 · 1452 阅读 · 0 评论 -
UVA 10717 - Mint
求lcm,枚举所有4种硬币就可以了.#include #include #include #include using namespace std;const int MAX = 51;int len[MAX],n, t, ans_min, ans_max;int gcd(int a, int b){ return !b ? a : gcd(b, a % b);}i原创 2014-03-07 17:05:22 · 397 阅读 · 0 评论 -
HDU 1576 A/B
题意很清楚,给出n = A % 9973, B gcd(B, 9973)为1, 求(A/B)%9973.模运算有很多性质:(a+b) % c==(a % c + b % c) %c , (a-b) % c==(a % c - b % c), (a*b) % c==(a % c * b % c),但是除法没有这个性质.不过可以通过求B的乘法逆元来求得.解法:(a / b) % c ==原创 2014-03-08 21:02:08 · 879 阅读 · 0 评论 -
ZOJ 1889 Ones
由公式(a + b) % c = (a % c + b % c) %c可以边乘边模边地计数.如 11 % 6 = ( 10 % 6 + 1 % 6) % 6 -> 111 % 6 = (110 % 6 + 1 % 6) % 6#include #include using namespace std;int main(){ int n; while(~scanf("原创 2013-05-28 20:30:30 · 689 阅读 · 0 评论 -
HDU1299 Diophantus of Alexandria
题目大意:给出n 求1/x + 1/y = 1/n满足x 从题目可以看出x>=n, y>=n设y = n + k 带入原式化简移项得到x=n*n/k + n题目就变成了求n*n/k结果为整数的个数,也就是求n*n的因子个数.如果一个数字 n = p1^r1 * p2^r2 * ... pk^rk ,那么 n*n = p1^r1 * p2^r2 * ... pk^rk * p1^原创 2014-03-02 17:41:24 · 636 阅读 · 0 评论 -
HDU3988 Harry Potter and the Hide Story
首先对K进行素因子分解,分解成:p1^r1 * p2^r2*...pk^rk.然后求出n!含有的K的因子pi的个数,把这个数除以ri得到一个值,取这个值最小值就是答案.#include #include #include using namespace std;#define INF 9223372036854775807LLconst int MAX = 10000050;原创 2014-03-04 20:57:10 · 607 阅读 · 0 评论 -
HDU1492 The number of divisors(约数) about Humble Numbers
首先把n分解成2, 3, 5, 7相乘的形式.然后通过二进制枚举各个因子相乘的组合.#include #include using namespace std;const int p[4] = {2, 3, 5, 7}; int expo[4], exp_idx;int main(){ long long n; while(~scanf("%I64d", &n) && n){原创 2014-03-04 20:45:45 · 572 阅读 · 0 评论 -
HDU1920 Jackpot
题意:求n个数字同时到0的周期.就是求最小公倍数.注意long long.#include using namespace std;long long gcd(long long a, long long b){ return !b ? a : gcd(b, a % b);}int main(int argc, char const *argv[]){ int T;原创 2014-03-10 21:40:00 · 537 阅读 · 0 评论 -
HDU1905 Pseudoprime numbers
题意:给出p, a两个整数,判断p是否是以a为底的假素数,也就是要满足a^p=a(mod p).可以用快速幂取模求出a^p来做.#include using namespace std;bool is_prime(int n){ for(int i = 2; i * i <= n; ++i){ if(n % i == 0)return false; } return tru原创 2014-03-10 19:57:12 · 637 阅读 · 0 评论 -
UVA 138 - Street Numbers
求1 + 2 + ... (C - 1) == (C+ 1) + (C + 2) + ... + N利用求和公式可以得出C^2 = N * (N + 1) / 2,枚举n.两边开根号,如果C的值是整数那么就是一个解.直接输出答案了.#include using namespace std;int main(int argc, char const *argv[]){原创 2014-03-05 22:01:54 · 535 阅读 · 0 评论 -
UVA 128 - Software CRC
给出一串字符串,求其循环冗余校验码.求法:把整个字符串看成一个整数m,第一个字符作为这个整数的最高字节,第二字作为次高字节. etc...要求在这个整数最后加上两个字节变成m2,使其整除34943.解法:快速幂取模,粒度为一个字节.#include #include using namespace std;#define MOD 34943char message[1025原创 2014-03-06 13:09:57 · 724 阅读 · 0 评论 -
模(%)运算 对 四则运算的封闭性(除法!)
首先想说的是, a%b. 一般都是a>0,b>0 或 a0. 其它情况就不要考虑了。 下面说明了为这么只需要考虑这两种情形。 其次,本文总结了模运算对加法、减法、乘法的封闭性。讨论是除法与模运算之间的关系,从而得到一个实用的公式。========================正文(精华在文末...)========================转载 2014-05-16 18:48:43 · 3001 阅读 · 2 评论