题目链接

输入t对数 a, b

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

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

思路:

素数的素因子个数是1

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

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

 1     void solve(){
 2         Scanner sc = new Scanner(System.in);
 3         int t = sc.nextInt();
 4         int a ,b;
 5         int MAX = 5000000;
 6         int[] arr=new int[MAX+1];
 7         for(int i=2;i<=MAX;i++){
 8             if(i%2==0){
 9                 arr[i] = arr[i/2]+1;
10                 continue;
11             }
12             for(int j=3;j*j<=i;j+=2){
13                 int k=i/j;
14                 if(k*j==i){
15                     arr[i] = arr[k] + 1;
16                     break;
17                 }
18             }
19             if (arr[i]==0)
20                 arr[i] = 1;
21         }
22         for(int i=2;i<=MAX;i++)
23             arr[i]+=arr[i-1];
24         while(t!=0){
25         a = sc.nextInt();
26         b = sc.nextInt();
27         System.out.println(arr[a]-arr[b]);
28         t--;
29         }
30     }

View Code

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

这个是利用素数的,找到第一个素数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);}

View Code

换了读数据的方式,成功通过,这里利用到,素数筛选法求出素数的集合

参考链接

还有下面一种,都是参考素数筛选法的求解

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

View Code

全部程序如下

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

转载于:https://www.cnblogs.com/theskulls/p/4851288.html

Codeforces D546:Soldier and Number Game相关推荐

  1. 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 ...

  2. Codeforces 768E:Game of Stones

    Codeforces 768E:Game of Stones 题目链接:http://codeforces.com/contest/768/problem/E 题目大意:给定$n$堆石子,初始每堆$s ...

  3. 动手写个数字输入框1:input[type=number]的遗憾

    前言  最近在用Polymer封装纯数字的输入框,开发过程中发现不少坑,也有很多值得研究的地方.本系列打算分4篇来叙述这段可歌可泣的踩坑经历: <动手写个数字输入框1:input[type=nu ...

  4. Codeforces 798C:Mike and gcd problem

    Codeforces 798C:Mike and gcd problem 题目链接:http://codeforces.com/contest/798/problem/C 题目大意:给出一个大小为$n ...

  5. Codeforces 754E:Dasha and cyclic table

    Codeforces 754E:Dasha and cyclic table 题目链接:http://codeforces.com/problemset/problem/754/E 题目大意:$A$矩 ...

  6. Codeforces 348C:Subset Sums

    Codeforces 348C:Subset Sums 题目链接:http://codeforces.com/contest/348/problem/C 题目大意:给出$n$个数,$m$个集合(每个集 ...

  7. java long类型报错:error: integer number too large

    Java 基本数据类型(先介绍下java的基本数据类型) 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来 ...

  8. 问题解决:Invalid version number:Version number may be negative or greater than 255

    问题描述: 本人java版本1.8,使用Idea运行一个简单的SpringBoot项目出现以下问题: Invalid version number: Version number may be neg ...

  9. oracle存储过程报错:ORA-06550: wrong number or types of arguments in call to

    问题:ORA-06550: wrong number or types of arguments in call to 原因:参数问题造成: 解决方案:检查参数个数及参数值 转载于:https://w ...

  10. 【CodeForces】[546A]Soldier and Bananas

    直接运算 并没有什么弯 注意int就足以储存数据 不需要借钱时(n>res) 输出 0 #include<stdio.h> int main() {int k,n,w;while(s ...

最新文章

  1. 美多商城之支付(支付宝介绍)
  2. 那个博士生以死控告的教授,被ACM撤销了会员资格
  3. python编程基础教程-史上最全Python编程基础入门教程
  4. vscode必备插件_10个必备的Visual Studio Code (VS code)插件
  5. python中ntlk报错及解决
  6. 第二章 Javac编译原理
  7. facebook react.js
  8. 编译原理教程_5 自底向上分析
  9. 嵌入式学习流程(参考一)
  10. Linux 开发环境搭建与使用——SlickEdit 的安装与配置
  11. mysql 数据恢复 binlog
  12. UE4插件共享汇总大全
  13. 中国生物农药市场投资前景及“十四五”规划建议报告2022-2028年
  14. html天气js,H5 实现天气效果(心知天气插件)
  15. 金融中需要的计算机知识,金融笔试中的综合知识一般会考什么?
  16. SDIO_WiFi驱动学习之安卓WLAN架构介绍及调用流程分析
  17. SAP ABAP ZBA_R004 批量导入角色里的事务代码,解放BASIS的双手
  18. 和ChatGPT的一番对话
  19. 36 个助你成为专家需要掌握的 JavaScript 概念
  20. ESP8266人体感应项目

热门文章

  1. iOS开发之Swift 4 JSON 解析指南
  2. 区块链开发(一)搭建基于以太坊的私有链环境
  3. MacBooster清理除Mac大文件和旧文件
  4. 2019最强Python书单,喜欢看书的小伙伴看这里!
  5. 华住:移动时代,自主可控的架构秘密
  6. [原创] 数据库小工具 (BatchESQL.exe)
  7. TIC大咖说|氦氪云:用云服务推动智能家居发展
  8. beanstalkd最佳实践-编程开发
  9. CLISP语言中的哈希表
  10. js Math对象属性和方法