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

 

转载于:https://www.cnblogs.com/tak-fate/p/7283654.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值