【Codeforces 385C】Bear and Prime Numbers

【链接】 我是链接,点我呀:)
【题意】

f[i]表示在x[]中有多少个数字是i的倍数 让你求出sum(f[i]) li<=i<=ri 且i是质数

【题解】

做筛法求素数的时候顺便把素数i在x[]中的倍数的个数求出来就好 前缀和 输出即可

【代码】

import java.io.*;
import java.util.*;

public class Main {
	
	
	static InputReader in;
	static PrintWriter out;
		
	public static void main(String[] args) throws IOException{
		//InputStream ins = new FileInputStream("E:\rush.txt");
		InputStream ins = System.in;
		in = new InputReader(ins);
		out = new PrintWriter(System.out);
		//code start from here
		new Task().solve(in, out);
		out.close();
	}
	
	static int N = (int)1e7;
	static class Task{
		public void solve(InputReader in,PrintWriter out) {
			int n;
			int []cnt = new int [N+10];
			int []shai = new int [N+10];
			long []f = new long [N+10];
			n = in.nextInt();
			for (int i = 1;i <= n;i++) {
				int x;
				x = in.nextInt();
				cnt[x]++;
			}
			
			for (int i = 2;i <= N;i++)
				if (shai[i]==0) {
					f[i] = cnt[i];
					for (int j = 2*i;j <= N;j+=i) {
						f[i] = f[i] + cnt[j];
						shai[j] = 1;
					}
				}
			for (int i = 1;i <= N;i++)
				f[i]=f[i-1]+f[i];
			n = in.nextInt();
			for (int i = 1;i <= n;i++) {
				int l,r;
				l = in.nextInt();r = in.nextInt();
				l = Math.min(l, N);r = Math.min(r,N);
				out.println(f[r]-f[l-1]);
			}
		}
	}

	

	static class InputReader{
		public BufferedReader br;
		public StringTokenizer tokenizer;
		
		public InputReader(InputStream ins) {
			br = new BufferedReader(new InputStreamReader(ins));
			tokenizer = null;
		}
		
		public String next(){
			while (tokenizer==null || !tokenizer.hasMoreTokens()) {
				try {
				tokenizer = new StringTokenizer(br.readLine());
				}catch(IOException e) {
					throw new RuntimeException(e);
				}
			}
			return tokenizer.nextToken();
		}
		
		public int nextInt() {
			return Integer.parseInt(next());
		}
	}
}
原文地址:https://www.cnblogs.com/AWCXV/p/10364718.html