Codeforces D546:Soldier and Number Game
输入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的更多相关文章
- CodeForces 546 D. Soldier and Number Game(素数有关)
Description Two soldiers are playing a game. At the beginning first of them chooses a positive integ ...
- 【codeforces 546D】Soldier and Number Game
time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 网络流(最大流) CodeForces 546E:Soldier and Traveling
In the country there are n cities and m bidirectional roads between them. Each city has an army. Arm ...
- Codeforces J. Soldier and Number Game(素数筛)
题目描述: Soldier and Number Game time limit per test 3 seconds memory limit per test 256 megabytes inpu ...
- 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 ...
- DP+埃氏筛法 Codeforces Round #304 (Div. 2) D. Soldier and Number Game
题目传送门 /* 题意:b+1,b+2,...,a 所有数的素数个数和 DP+埃氏筛法:dp[i] 记录i的素数个数和,若i是素数,则为1:否则它可以从一个数乘以素数递推过来 最后改为i之前所有素数个 ...
- 数学+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;再来一个前缀和 */ /***************** ...
- 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 ...
- 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 ...
随机推荐
- nodejs ssh2
https://www.npmjs.com/package/ssh2 npm install ssh2 ssh2文件下载: //前台命令下发 app.get('/test/fileDownload' ...
- c#读写注册表示例分享
c#读写注册表示例,示例中有详细注释. 代码: //写注册表RegistryKey regWrite;//往HKEY_CURRENT_USER主键里的Software子键下写一个名为“Test”的子键 ...
- Amazon S3 PHP Class Documentation
API : http://undesigned.org.za/2007/10/22/amazon-s3-php-class/documentation Example: http://www.phpb ...
- Rewrite规则简介
Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式.如果要想用到rewrite模块,必须先 ...
- WebApp
目前的手机APP有三类:原生APP,WebAPP,HybridApp:HybridApp结合了前两类APP各自的优点,越来越流行. Hybrid App的兴起是现阶段移动互联网产业的一种偶然.移动互联 ...
- XHTML1.0对HTML4.0的改进
1.XHTML借鉴了XML的写法,语法更加严格: 2.XHTML实现了把页面样式和内容分离了,废弃了HTML4.0中表示样式的标签和属性,推荐使用CSS样式来描述页面的样式. XHTML1.0 分为两 ...
- 无法解析的外部符号 _WinMain@16 fatal error LNK1120: 1 个无法解析的外部命令
一,问题描述MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 ...
- VS2010调试入门指南
1 导言 在软件开发周期中,测试和修正缺陷(defect,defect与bug的区别:Bug是缺陷的一种表现形式,而一个缺陷是可以引起多种Bug的)的时间远多于写代码的时间.通常,debug是指发现缺 ...
- linux编码
转: Linux查看文件编码格式及文件编码转换 如果你需要在Linux中操作windows下的文件,那么你可能会经常遇到文件编码转换的问题.Windows中默认的文件格式是GBK(gb2312),而L ...
- php开发过程中用什么方法来加快页面的加载速度
1,数据库优化;2,php缓存;3,使用zend引擎(其它框架);4,分布式部署;5,静态