【Codeforces 385C】Bear and Prime Numbers
阿新 • • 發佈:2019-02-12
sys cpp stat ioe int static input time next
【鏈接】 我是鏈接,點我呀:)
【題意】
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()); } } }
【Codeforces 385C】Bear and Prime Numbers