(素数暴力筛)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 }