题目链接

输入t对数 a, b

求(b,a]内的每个数拆成素因子的个数和

这里每个数都可以写成素数的乘积,可以写成几个素数的和就有几个素因子,这里求的是(b,a]内的素因子和

思路:

素数的素因子个数是1

对于非素数A的素因子个数 = A/k  + 1 其中k是素数,也是第一个素数,或者K是比A小的数,并且A%k==0

下面是利用K是比A小的数,并且A%k==0

     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--;
}
}

这个读数据效率低,造成运行时间超时

这个是利用素数的,找到第一个素数K,并且A%k==0

    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);
}
全部程序如下
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(); } }

Codeforces D546:Soldier and Number Game的更多相关文章

  1. CodeForces 546 D. Soldier and Number Game(素数有关)

    Description Two soldiers are playing a game. At the beginning first of them chooses a positive integ ...

  2. 【codeforces 546D】Soldier and Number Game

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  3. 网络流(最大流) CodeForces 546E:Soldier and Traveling

    In the country there are n cities and m bidirectional roads between them. Each city has an army. Arm ...

  4. Codeforces J. Soldier and Number Game(素数筛)

    题目描述: Soldier and Number Game time limit per test 3 seconds memory limit per test 256 megabytes inpu ...

  5. Codeforces Round #304 (Div. 2) D. Soldier and Number Game 数学 质因数个数

    D. Soldier and Number Game Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/conte ...

  6. DP+埃氏筛法 Codeforces Round #304 (Div. 2) D. Soldier and Number Game

    题目传送门 /* 题意:b+1,b+2,...,a 所有数的素数个数和 DP+埃氏筛法:dp[i] 记录i的素数个数和,若i是素数,则为1:否则它可以从一个数乘以素数递推过来 最后改为i之前所有素数个 ...

  7. 数学+DP Codeforces Round #304 (Div. 2) D. Soldier and Number Game

    题目传送门 /* 题意:这题就是求b+1到a的因子个数和. 数学+DP:a[i]保存i的最小因子,dp[i] = dp[i/a[i]] +1;再来一个前缀和 */ /***************** ...

  8. Codeforces Round #304 (Div. 2) D. Soldier and Number Game 素数打表+质因数分解

    D. Soldier and Number Game time limit per test 3 seconds memory limit per test 256 megabytes input s ...

  9. Codeforces Round #304 (Div. 2)-D. Soldier and Number Game,素因子打表,超时哭晕~~

    D. Soldier and Number Game time limit per test 3 seconds memory limit per test 256 megabytes input s ...

随机推荐

  1. WPF 绑定二(绑定指定的字符串)

    xaml: <Window x:Class="WpfApplication1.Window2" xmlns="http://schemas.microsoft.co ...

  2. 5种IO模型

    Unix下可用的5种I/O模型分别是: 阻塞IO 非阻塞IO IO复用(select和poll) 信号驱动式IO(SIGIO) 异步IO(POSIX的aio系列函数)   阻塞式I/O模型:      ...

  3. 通过百度地图API定位--第三方开源--百度地图(一)

    1.把百度地图定位API(下载地址:http://lbsyun.baidu.com/sdk/download?selected=location)里面的libs复制到自己的项目libs里面 2.进行相 ...

  4. 边界函数Bounding Function(成长函数的上界)

    根据成长函数的定义,猜测    -->break point K restricts maximum possible mh(N) a lot for N>k bounding funct ...

  5. hdu 5690 2016"百度之星" - 初赛(Astar Round2A) All X 快速二次幂 || 寻找周期

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5690 题意:m个数字全为x mod k ?= c;其中m <= 1010,0 < c,k ...

  6. Linux之mount命令详解

    linux下挂载(mount)光盘映像文档.移动硬盘.U盘.Windows和NFS网络共享linux是个优秀的开放源码的操作系统,能够运行在大到巨型小到掌上型各类电脑系统上,随着linux系统的日渐成 ...

  7. MVC学习系列——记一次失败面试后,感想。

    在此写博客之际,热烈庆祝母校苏州科技学院,正式改名为苏州科技大学. 一晃眼,从自己投身IT行业已经两年有余,期间经历了结婚.买房等人生大事,非常感谢我的老婆,谢谢她这么爱我,嫁给我这个码农,呵呵... ...

  8. 基于FPGA的线阵CCD图像测量系统研究——笔记

    本文是对基于FPGA的线阵CCD图像测量系统研究(作者:高尚)的阅读笔记 第一章绪论 1. 读读看 读了前面的摘要依然没有看懂作者要做什么.接着往下读....终于看到了一个字眼“基于机器视觉的图像测量 ...

  9. virtualbox usb连接问题解决

    生命在于折腾... 神奇的liinux... ubuntu 14.04 LTS sudo apt-get install virtualbox -y 然后建好虚拟机之后(windows也好,linux ...

  10. Ext学习-基础概念,核心思想介绍

    1.目标   本阶段的目标是通过学习一些基础知识来对EXTJS有个整体的了解,知道EXTJS的基础语法,核心设计思想等等 2.内容   1.基础部分学习   2.EXTJS类系统介绍   3.EXTJ ...