HDU 3823 Prime Friend(线性欧拉筛+打表)

Besides the ordinary Boy Friend and Girl Friend, here we define a more academic kind of friend: Prime Friend. We call a nonnegative integer A is the integer B’s Prime Friend when the sum of A and B is a prime. 
So an integer has many prime friends, for example, 1 has infinite prime friends: 1, 2, 4, 6, 10 and so on. This problem is very simple, given two integers A and B, find the minimum common prime friend which will make them not only become primes but also prime neighbor. We say C and D is prime neighbor only when both of them are primes and integer(s) between them is/are not.

InputThe first line contains a single integer T, indicating the number of test cases. 
Each test case only contains two integers A and B.

Technical Specification

1. 1 <= T <= 1000 
2. 1 <= A, B <= 150OutputFor each test case, output the case number first, then the minimum common prime friend of A and B, if not such number exists, output -1.Sample Input

2
2 4
3 6

Sample Output

Case 1: 1
Case 2: -1

题意:给出两个整数ab 使a+x b+x均为素数 且ab之间没有素数 求最小的符合条件的x

思路:java数组开大了就爆空间,注意空间;一个潜在条件a+x-(b+x)=a-b<150,即两个素数之差小于150;

代码:
import java.util.Scanner;
public class Main {
        static final int max=(int)16000000;
        static int prime[]=new int[1031131];
        static boolean is_prime[]=new boolean[max];
        static int k=0;
        public static void Prime(){
              is_prime[0]=is_prime[1]=true;
              for(int i=2;i<max;i++){
                    if(!is_prime[i]) prime[k++]=i;
                    for(int j=0;j<k&&prime[j]*i<max;j++){
                          is_prime[i*prime[j]]=true;
                          if(i%prime[j]==0) break;
                    }
              }
        }
        public static void main(String[] args) {
               Prime();
//             System.out.println(k);
               Scanner scan=new Scanner(System.in);
               int t=scan.nextInt();
               for(int i=1;i<=t;i++){
                     int a=scan.nextInt();
                     int b=scan.nextInt();
                     if(a>b) {
                           int tmp=a;
                           a=b;
                           b=tmp;
                     }
                     System.out.print("Case "+i+": ");
                     boolean flag=false;
                     int num=0;
                     for(int j=0;j<k-1;j++){
                          if(prime[j]>=a && prime[j+1]>=b &&prime[j]-a==prime[j+1]-b &&prime[j+1]-prime[j]<150){
                                 num=prime[j]-a;
                                 flag=true;
                                 break;
                          }
                     }
                     if(flag) System.out.println(num);
                     else System.out.println("-1");
               }
        }
}

原文地址:https://www.cnblogs.com/qdu-lkc/p/12195537.html

时间: 2024-10-08 21:05:31

HDU 3823 Prime Friend(线性欧拉筛+打表)的相关文章

Dirichlet&#39;s Theorem on Arithmetic Progressions POJ - 3006 线性欧拉筛

题意 给出a d n    给出数列 a,a+d,a+2d,a+3d......a+kd 问第n个数是几 保证答案不溢出 直接线性筛模拟即可 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 bool Is_Primes[1000005]; 5 int Primes[1000005]; 6 int A[1000005]; 7 int cnt; 8 void Prime(int n){ 9 cnt=0; 1

Goldbach&#39;s Conjecture POJ - 2262 线性欧拉筛水题 哥德巴赫猜想

题意 哥德巴赫猜想:任一大于2的数都可以分为两个质数之和 给一个n 分成两个质数之和 线行筛打表即可 可以拿一个数组当桶标记一下a[i]  i这个数是不是素数  在线性筛后面加个装桶循环即可 #include<cstdio> #include<cstring> using namespace std; bool Is_Primes[1000005]; int Primes[1000005]; int cnt; void Prime(int n){ cnt=0; memset(Is_

hdu 2824 The Euler function 欧拉函数打表

The Euler function Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description The Euler function phi is an important kind of function in number theory, (n) represents the amount of the numbers which are sm

线性(欧拉)筛&amp;欧拉函数

线性筛法 what is 线性筛??就是基于最基本的筛法的优化. 在基础的筛法上,我们发现有的数字会被重复筛,例如6既会被2枚举到也会被3枚举到,必然有重复运算. 我们的做法就是让每一个数的最小因数筛. \(FOR\) \(EXAMPLE:\) 有一个数\(2 * 2 * 3 * 5\) 有另一个数 \(3 * 3 * 3* 5\) 那么第一个数枚举到3的话,筛到的数字是\(2 * 2 * 3 * 3 * 5\) 但是在第二个数字再次枚举的时候 枚举到2时 也会枚举到\(2 * 2 * 3 *

BZOJ 2818 Gcd 线性欧拉筛(Eratosthenes筛)

题目大意:给定整数N(N <= 1e7),求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.. 思路:推一推. 设gcd(x,y) = p,则x / p与y / p互质 问题就转化成了N / p中有多少个数互质,然后累加就可以了. =>对于任意a,b,a <= N / p,b <= N / p,且a与b互质 =>gcd(a,b) == 1 现在问题就很明显了,看到这个形式就很容易想到欧拉函数,求一下phi,算一下前缀和,累加. 注意这里求欧拉一

线性欧拉筛

//欧拉函数 小于等于 n 且与n互质的正整数个数 #include <bits/stdc++.h> using namespace std; const int N = 100001; int n,p; int prime[N],phi[N],mark[N]; int main(){ cin >> n; phi[1] = 1; for(int i = 2; i <= n; ++i){ if(!mark[i]){ prime[++p] = i; phi[i] = i - 1;

Sum of Consecutive Prime Numbers POJ - 2739 线性欧拉筛(线性欧拉筛证明)

题意:给一个数 可以写出多少种  连续素数的合 思路:直接线性筛 筛素数 暴力找就行   (素数到n/2就可以停下了,优化一个常数) 其中:线性筛的证明参考:https://blog.csdn.net/nk_test/article/details/46242401 https://blog.csdn.net/qq_40873884/article/details/79124552 https://blog.csdn.net/baoli1008/article/details/50788512

BZOJ 2190 SDOI 2008 仪仗队 线性欧拉筛

标题效果:有一个格子组件图,假设三个人在一条直线上,那么第一个人将不会看到第三人.现在,有一个人站在(1,1)在.我问他是否能看到n*n的人数的矩阵. 思考:如果你想站(1,1)这名男子看到了一个立场(x,y)一个人.gcd(x,y) == 1,这是一个经典的模型,仅仅要求出n以内phi的和就能够了. 方法就是线性筛. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <

The Embarrassed Cryptographer POJ - 2635 同余模+高精度处理 +线性欧拉筛(每n位一起处理)

题意:给出两数乘积K(1e100) 和 一个数L(1e6)  问有没有小于L(不能等于)的素数是K的因数 思路:把数K切割 用1000进制表示   由同余模公式知   k%x=(a*1000%x+b*1000*1000%x+c*1000*1000*1000%x....) a b c等为 相应位置的三位数  这样切割可以减少模的次数 防止超时 1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #incl