您的位置:首页 > 其它

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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: