(素數暴力篩)HDU - 6069 Counting Divisors

分析:java

現場的時候,學長A的很快,隊友寫了一個瞎幾把優化的素數篩,C++T了。c++

而後本地試了15組最差數據,跑了6s,而後就用java重寫一波,交了以後7sA了。。優化

又學了一招,,C++勉強超時java說不定可過。。spa

 

不過正解應該在《挑戰程序設計》的120-121頁,如出一轍的數據規模,,學長就是改這個A的。。設計

聽說標程也差很少。code

 

代碼(java,和C++如出一轍的):blog

 1 import java.io.*;  
 2 import java.math.*;  
 3 import java.util.*;  
 4 import java.text.*;  
 5 
 6 public class Main {
 7     static int p[] = new int[100010];
 8     static long m[] = new long[1000010];
 9     static long m2[] = new long[1000010];
10     static int num=0;
11     static long mod = 998244353;
12     
13     static void init(){
14         for(long i=2;i<=1000000;i++){
15             if(m[(int)i]==0){
16                 p[num++]=(int)i;
17                 for(long j=i*i;j<=1000000;j+=i){
18 //                    System.out.println(j);
19                     m[(int)j]=1;
20                 }
21             }
22         }
23     }
24     
25     static public void main(String args[]){
26         init();
27         int t;
28         Scanner cin = new Scanner (new BufferedInputStream(System.in));
29         t=cin.nextInt();
30         long l,r,k;
31         while(t-->0){
32             long sum=0;
33             l=cin.nextLong();
34             r=cin.nextLong();
35             k=cin.nextLong();
36             for(int i=0;i<=(int)(r-l);i++){
37                 m2[i]=m[i]=1;
38             }
39             for(int i=0;i<num;i++){
40                 long x=l/p[i];
41                 if(l%p[i]!=0)x++;
42                 long a;
43                 x*=p[i];
44                 while(x<=r){
45                     a=x;
46                     long c=0;
47                     while(a%p[i]==0){
48                         c++;
49                         a/=p[i];
50                     }
51                     m[(int)(x-l)]=m[(int)(x-l)]*(c*k+1)%mod;
52                     m2[(int)(x-l)]*=(x/a);
53                     x+=p[i];
54                 }
55             }
56             for(long i=l;i<=r;i++){
57                 if(m2[(int)(i-l)]!=i)m[(int)(i-l)]=m[(int)(i-l)]*(k+1)%mod;
58             }
59             for(long i=l;i<=r;i++){
60                 sum=(sum+m[(int)(i-l)])%mod;
61             }
62             System.out.println(sum);
63         }
64         
65         
66     }
67 }
相關文章
相關標籤/搜索