首页 > 其他 > 详细

数论基础小记

时间:2014-03-06 23:00:09      阅读:492      评论:0      收藏:0      [点我收藏+]

对于数论 首先要提的当然是素数了 先从素数开始 这里的题目大部分来自网上一大神的数学题的总结   自己挑了一部分拿来练习

POJ 2689 Prime Distance  经典的区间素数筛选 

一般看题的时候重点会看下数据范围 这题明显告诉你了l u 差不超过100W 那就想到可以从这里入手 对于100W内的素数我们是可以很快筛出来的 21Y就不太可能了 

所以可以转换下 先把47000内的素数打表筛出来 然后再用这些素数去筛 l-u内的素数 筛法与筛小的类似 因为差不超过100W 所以是可以很快解决掉的

注意一下 有1的情况吧

bubuko.com,布布扣
 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 using namespace std;
11 #define N 47000
12 #define M 1000010
13 #define LL long long
14 #define INF 0xfffffff
15 const double eps = 1e-8;
16 const double pi = acos(-1.0);
17 const double inf = ~0u>>2;
18 int p[N],g;
19 LL res[M];
20 bool f[N+10];
21 bool v[M];
22 void init()
23 {
24     int i,j;
25     for(i = 2 ; i<= N ; i++)
26     {
27         if(!f[i])
28         {
29             for(j = i+i ; j <= N;j+=i)
30             f[j] = 1;
31             p[++g] = i;
32         }
33     }
34 }
35 int main()
36 {
37     LL i,j;
38     LL l,u;
39     init();
40     while(scanf("%lld%lld",&l,&u)!=EOF)
41     {
42         memset(v,0,sizeof(v));
43         int o=0;
44         LL y;
45         for(i = 1; i <= g ; i++)
46         {
47            if(l%p[i])
48            {
49                y = (l/p[i]+1)*p[i];
50            }
51            else y = l;
52            for(j = y ; j <= u ; j+=p[i])
53                if(j!=p[i])
54                v[j-l] = 1;
55         }
56         if(l==1) v[0] = 1;
57         for(i = l ; i <= u; i++)
58         if(!v[i-l])
59         {
60             res[++o] = i;
61         }
62         if(o<2)
63         {
64             puts("There are no adjacent primes.");
65             continue;
66         }
67         LL minz=M,st,en,ss,ee,maxz=0;
68         for(i = 1; i < o ; i++)
69         {
70             if(res[i+1]-res[i]<minz)
71             {
72                  minz = res[i+1]-res[i];
73                  st = res[i];
74                  en = res[i+1];
75             }
76             if(res[i+1]-res[i]>maxz)
77             {
78                  maxz = res[i+1]-res[i];
79 
80                  ss = res[i];
81                  ee = res[i+1];
82             }
83         }
84         printf("%lld,%lld are closest, %lld,%lld are most distant.\n",st,en,ss,ee);
85     }
86     return 0;
87 }
View Code

数论基础小记,布布扣,bubuko.com

数论基础小记

原文:http://www.cnblogs.com/shangyu/p/3585324.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!