(素数暴力筛)HDU - 6069 Counting Divisors

分析:

现场的时候,学长A的很快,队友写了一个瞎几把优化的素数筛,C++T了。

然后本地试了15组最差数据,跑了6s,然后就用java重写一波,交了之后7sA了。。

又学了一招,,C++勉强超时java说不定可过。。

 

不过正解应该在《挑战程序设计》的120-121页,一模一样的数据规模,,学长就是改这个A的。。

据说标程也差不多。

 

代码(java,和C++一模一样的):

 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 }

 

posted @ 2017-08-04 10:27  tak_fate  阅读(376)  评论(0编辑  收藏  举报