随笔分类 -  ACM_数论

摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4627[a,b]=ab/(a,b) a,b和一定时,越接近乘积越大,在接近的同时,尽量保持公因子最少。 如果n为2*k+1 那么 取a=2k,b=2k+1 最佳。 如果n为偶数=2k,就要进一步分k的奇偶性了。 n=4k 时 显然2k+2k会很小 2k-1,2k+1 就满足了 (2k-1,2k+1)=(2,2k+1)=1 。 如果n=4k+2 ,逐一实验2k+1,2k+1。 2k 2k+2. 2k-1,2k+3 。发现2k-1,2k+3是最佳的,而且他们已经互素了,再增大差距结果不会优于这组。 .. 阅读全文
posted @ 2013-09-19 15:00 814jingqi 阅读(133) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4722考虑怎样的数可以成为good number ,如果不给范围,取一个n位数 (最高位-1)*10*10....最后一位由前面的和决定。 首先不考虑0基于这样的思想 比如不超过54321的good number 有多少 ,1~4位有9+9*10+9*10*10(等比求和) 5位就是4*10*10*10+ 第一位是5 剩下的部分mod10==5,而且不超过4321这样就可以设计递归了。然后就是递归函数设计中 应该是long long的始终不要丢失精度 , 第二个参数递归下降时 不忘+10 再去mo. 阅读全文
posted @ 2013-09-12 01:12 814jingqi 阅读(103) 评论(0) 推荐(0)
摘要:题目地址:http://poj.org/problem?id=3844思路: a[i]+a[i+1]+...+a[j]=s[j]-s[i]; 于是整除等价于 s[i]===s[j] (mod d); 然后统计出现了多少次 c[n][2]就可以了 。 值得注意的是,有可能50000* (50000-1)/2 要用long long每次进入一个新case 后把p 清零,sum【i】表示前i个数的和, 0= #include #include using namespace std; int sum[50005]; int p[1000000]; int main() { int T; ci... 阅读全文
posted @ 2013-09-04 11:10 814jingqi 阅读(167) 评论(0) 推荐(0)
摘要:题目地址:http://poj.org/problem?id=3842 或者:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2610思路就是暴力求出每一种可能的情况,进行全排列(next_permutation可以去重)然后对每一种排列考虑前面的子串。为了防止一个情况被考虑两次,设置一个占位符b[10000000] 每次新输入数,记得将b清空,然后先转化成int数组,每次翻译成一个int时快一些。这个代码在Uva 阅读全文
posted @ 2013-09-04 01:36 814jingqi 阅读(235) 评论(0) 推荐(0)
摘要:题目地址:http://poj.org/problem?id=2689题目思路: 找出int 内所有素数空间上时不允许的,但是题目要求l ,u的差不超过100w ,在空间上还是允许的。然后先找出5w以内的素数,这样的可以中这些素数作为合数最小的素因子将这个合数筛掉。 几个要注意的地方 【1】 因为l可能很大,j的起点不能去“p*p” 然后比L小就加一个p,想一下如果p=2,l很大会花很多时间的。 【2】 然后就是这个j 要用long long 存 ,因为我们找到的j的初值是p 的倍数中第一个大于等于L的,l很大时可能超long long。 【3】 这个筛法筛去的第一个数是4 所以1要特判 .. 阅读全文
posted @ 2013-08-27 01:03 814jingqi 阅读(150) 评论(0) 推荐(0)
摘要:题目地址:http://acm.sgu.ru/problem.php?contest=0&problem=499分析思路: 直接计算两两的最大公约数会超时的,我们换个角度看问题,我们找到输入进来的数的所有约数,如果某个数出现了两次或者以上,那么满足条件的最大的就是ggcd了然后就是类似于筛法找约数, 这样可以找到 1~n中,每个数不超过自己平方根的所有约数。 然后比平方根大的那个可以用它除出来(完全平方数要特判了)。然后不是暴力直接从最大的开始找出现过两次的,我们设置一个maxn来记录就好了,每次第二次出现的数和maxn比较一下就可以了。先看代码:#include #include # 阅读全文
posted @ 2013-08-25 03:14 814jingqi 阅读(177) 评论(0) 推荐(0)
摘要:题目地址:http://poj.org/problem?id=3233思想: 1模仿快速模幂法 ; 给矩阵写一个快幂 2 但是k太大 直接求和还是会tle 这个很像等比数列求和 但是可以递归用二分求,理论基础如下 : 求和二分:A+A^2+A...+A^(2k+1)= A+A^2+...+A^k+A^(k+1)+A^(k+1)*(A+A^2+...+A^k). 3 矩阵用结构体存储很好用呀 之前用int **存好像容易超内存 或者时间效率不高 4递归函数设计时,把调用递归的放在前面,这样实现自动回溯,而且不会爆栈 5 用g++... 阅读全文
posted @ 2013-07-22 22:20 814jingqi 阅读(161) 评论(0) 推荐(0)
摘要:#include using namespace std; int quick_mod(int a,int b,int m) { a=a%m; int ans=1; while(b) { if(b&1) { ans=(ans*a)%m; } b>>=1; a=(a*a)%m; } return ans; } int main() { int size; cin>>size; int m; int h; int a,b; while(cin>>m) ... 阅读全文
posted @ 2013-07-21 19:40 814jingqi 阅读(129) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1788说明: 题目很水 提到一个定理,求多个数的最小公倍数转化为求两个数的最小公倍数方法。 然后就是 a=b(mod m1) a=b(mod m2) 等价于a=b(mod [m1,m2] )#include using namespace std; typedef long long inta; int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } int main() { int k,a; ... 阅读全文
posted @ 2013-07-10 04:46 814jingqi 阅读(119) 评论(0) 推荐(0)
摘要:题目地址:http://poj.org/problem?id=1006中国剩余定理的应用#include using namespace std; typedef long long inta; void extend_gcd(inta a,inta b,inta &x,inta &y) { if(b==0) { x=1; y=0; } else { extend_gcd(b,a%b,x,y); int temp=x; x=y; y=temp-a/b*y; } } int main() ... 阅读全文
posted @ 2013-07-10 04:18 814jingqi 阅读(107) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3579要点; 题目要求正整数,一旦r1=0;应该输出最小公倍数#include #include using namespace std; typedef long long inta; void extend_gcd(inta a,inta b,inta &x,inta &y,inta &gcd) { if(b==0) { x=1; y=0; gcd=a; } else { extend_gcd(b,a... 阅读全文
posted @ 2013-07-10 02:33 814jingqi 阅读(110) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1573注意要点:1 最后的次数直接用除法 取高斯加1即可 若用加法累加会超时2 很容易漏掉的一点是题目要求正整数个数, 不是非负整数 ,如果最后r1==0 而且结果不是0 ,就要在结果上减一#include #include using namespace std; typedef long long inta; void extend_gcd(inta a,inta b,inta &x,inta &y,inta &gcd) { if(b==0) { x=1; ... 阅读全文
posted @ 2013-07-10 01:23 814jingqi 阅读(125) 评论(0) 推荐(0)
摘要:题目地址:http://poj.org/problem?id=2115#include #include using namespace std; typedef long long inta; void extend_gcd(inta a,inta b,inta &x,inta &y,inta &gcd) { if(b==0) { x=1; y=0; gcd=a; } else { extend_gcd(b,a%b,x,y,gcd); inta temp=x; x=y; ... 阅读全文
posted @ 2013-07-10 00:13 814jingqi 阅读(140) 评论(0) 推荐(0)
摘要:题目地址:http://poj.org/problem?id=2891#include #include using namespace std; typedef long long inta; void extend_gcd(inta a,inta b,inta &x,inta &y,inta &gcd) { if(b==0) { x=1; y=0; gcd=a; } else { extend_gcd(b,a%b,x,y,gcd); inta temp=x; x=y; ... 阅读全文
posted @ 2013-07-09 23:29 814jingqi 阅读(184) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1021说明 :题目很水但是有一个重要结论,只要是递推数列,一定是模周期数列 (可以用抽屉原理证明)#include using namespace std; int main() { int n; while(cin>>n) { if(n%8==2||n%8==6) cout<<"yes"<<endl; else cout<<"no"<<endl; } } 阅读全文
posted @ 2013-07-09 17:13 814jingqi 阅读(120) 评论(0) 推荐(0)
摘要:题目地址:http://acm.nefu.edu.cn/test/problemshow.php?problem_id=120#include #include #include using namespace std; typedef long long inta; inta multi(inta a,inta b, inta m) { inta rel=0; while(b>0) { if(b&1) { rel=(rel+a)%m; } b>>=1; a=(a0) {n>>=1; ... 阅读全文
posted @ 2013-07-09 15:19 814jingqi 阅读(277) 评论(0) 推荐(0)
摘要:题目地址:http://acm.nefu.edu.cn/test/problemshow.php?problem_id=120#include #include #include using namespace std; typedef long long inta; inta multi(inta a,inta b, inta m) { inta rel=0; while(b>0) { if(b&1) { rel=(rel+a)%m; } b>>=1; a=(a0) {n>>=1; ... 阅读全文
posted @ 2013-07-09 15:19 814jingqi 阅读(179) 评论(0) 推荐(0)
摘要:#include #include using namespace std; int main() { int k; cin>>k; int n; while(cin>>n) { int exponent=0; for(int i=1;pow(5.0,i) #include using namespace std; int main() { int k; cin>>k; int n; double p; while(cin>>n>>p) { int exponent=0; for(int i=1;... 阅读全文
posted @ 2013-07-09 03:58 814jingqi 阅读(229) 评论(0) 推荐(0)
摘要:#include #include #define M 16777220 using namespace std; bool composite[16777220]; int main() { int len=sqrt(M); for(int i=2;i>n) { int count=0; for(int i=2;i<=n/2;i++) if(composite[n-i]==0&&composite[i]==0) count++; cout<<count<<endl; } } // 打素数表 只需要 O(nlogn)的算法 题目地... 阅读全文
posted @ 2013-07-08 20:21 814jingqi 阅读(129) 评论(0) 推荐(0)
摘要:#include #include #define M 16777220 using namespace std; bool composite[16777220]; int main() { int len=sqrt(M); for(int i=2;i>n) { int count=0; for(int i=2;i<=n/2;i++) if(composite[n-i]==0&&composite[i]==0) count++; cout<<count<<endl; } } // 打素数表 只需要 O(n^1.5)的算法 阅读全文
posted @ 2013-07-08 20:21 814jingqi 阅读(248) 评论(0) 推荐(0)