Codeforces D546:Soldier and Number Game
2015-10-01 17:33
477 查看
题目链接
输入t对数 a, b
求(b,a]内的每个数拆成素因子的个数和
这里每个数都可以写成素数的乘积,可以写成几个素数的和就有几个素因子,这里求的是(b,a]内的素因子和
思路:
素数的素因子个数是1
对于非素数A的素因子个数 = A/k + 1 其中k是素数,也是第一个素数,或者K是比A小的数,并且A%k==0
下面是利用K是比A小的数,并且A%k==0
View Code
输入t对数 a, b
求(b,a]内的每个数拆成素因子的个数和
这里每个数都可以写成素数的乘积,可以写成几个素数的和就有几个素因子,这里求的是(b,a]内的素因子和
思路:
素数的素因子个数是1
对于非素数A的素因子个数 = A/k + 1 其中k是素数,也是第一个素数,或者K是比A小的数,并且A%k==0
下面是利用K是比A小的数,并且A%k==0
package codeforces; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class D546 { void run() throws NumberFormatException, IOException{ // solve();// 超时 solve3(); } void solve3() throws NumberFormatException, IOException{ int limit = 5000005; BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); int t=Integer.parseInt(br.readLine()); StringTokenizer st; int div[] = new int[limit]; boolean isPrime[] = new boolean[limit]; int prime[] = new int[limit]; int p=0; for(int i=2;i<limit;i++){ if(!isPrime[i]) prime[p++]=i; for(int j=0;j<p &&i*prime[j]<limit;j++){ isPrime[i*prime[j]] = true; if(i%prime[j]==0) break; } } for(int i=2;i<limit;i++){ int k = i; if(!isPrime[i]){ div[i] = 1; continue; } for(int j=0;j<p;j++){ if(k%prime[j]==0){ div[i] = div[k/prime[j]] + 1; break; } } } for(int i=2;i<limit;i++) div[i] += div[i-1]; StringBuilder sb=new StringBuilder(); for(int i=0;i<t;i++){ st=new StringTokenizer(br.readLine()); int a=Integer.parseInt(st.nextToken()); int b=Integer.parseInt(st.nextToken()); sb.append(div[a]-div[b]); sb.append('\n'); } System.out.print(sb); } void solve2() throws NumberFormatException, IOException{ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); int t=Integer.parseInt(br.readLine()); StringTokenizer st; int limit = 5000000; boolean[] array = new boolean[limit+1]; int div[] = new int[limit+1]; for(int i=2;i<=limit;i++){ if(array[i]) continue; for(int j=i;j<=limit;j+=i){ array[j] = true; int k=j; int temp=0; while(k%i==0){ k/=i; temp++; } div[j]+=temp; } } for(int i=1;i<=limit;i++) div[i]+=div[i-1]; StringBuilder sb=new StringBuilder(); for(int i=0;i<t;i++){ st=new StringTokenizer(br.readLine()); int a=Integer.parseInt(st.nextToken()); int b=Integer.parseInt(st.nextToken()); sb.append(div[a]-div[b]); sb.append('\n'); } System.out.print(sb); } void solve(){ Scanner sc = new Scanner(System.in); int t = sc.nextInt(); int a ,b; int MAX = 5000000; int[] arr=new int[MAX+1]; for(int i=2;i<=MAX;i++){ if(i%2==0){ arr[i] = arr[i/2]+1; continue; } for(int j=3;j*j<=i;j+=2){ int k=i/j; if(k*j==i){ arr[i] = arr[k] + 1; break; } } if (arr[i]==0) arr[i] = 1; } for(int i=2;i<=MAX;i++) arr[i]+=arr[i-1]; while(t!=0){ a = sc.nextInt(); b = sc.nextInt(); System.out.println(arr[a]-arr[b]); t--; } } public static void main(String[] args) throws NumberFormatException, IOException { new D546().run(); } }
View Code
相关文章推荐
- LeetCode(101)Symmetric Tree
- QT下int与QByteArray的转换
- LeetCode(101)Symmetric Tree
- #个人博客作业Week3——必应词典案例分析
- OpengGL第八版的第一个例子
- android问题集锦之一
- 齐达迪的第一篇博客
- ion torrent ion proton
- 合成和聚合的关系
- declare aa char(5) := 'b'; begin dbms_output.put_line(aa || '00'); end;
- A time to be promoted
- Aizu 2303 Marathon Match (概率)
- Android Studio如何引用jar包裹(不gradle)
- 黑马程序员——java学习笔记--日期操作类
- 快速排序
- C语言及程序设计.第二十三课.项目3.两段函数求值
- ThinkPHP控制器
- 黑马程序员——java学习笔记--正则表达式
- 关于Linux系统的平均负载最全面介绍
- 【点到线段距离】URAL - 1348 Goat in the Garden 2