Jan 09 - Count Primes; Mathematics; Optimization; Primes; DP;

第一种方法 The Sieve of Eratosthenes is one of the most efficient ways to find all prime numbers up to n.

The Sieve of Eratosthenes uses an extra O(n) memory and its runtime complexity is O(n log log n)

创建一个length = n的boolean数组 isPrime,每个元素初始化为true;

k = 2:(n-1),如果当前数k是prime,把 k^k - (n-1)/k *k的数 对映的 isPrime = false;

最后计算 从2到n-1 isPrime == true的个数。

代码:

public class Solution {
public int countPrimes(int n) {
boolean[] isPrimes = new boolean[n];
for(int i = 0; i < isPrimes.length; i++){
isPrimes[i] = true;
}

for(int k = 2; k <= (n-1)/k; k++){
if(isPrimes[k] == true){
for(int i = k; i <= (n-1)/k; i++){
isPrimes[i*k] = false;
}
}
}
int count = 0;
for(int i = 2; i< isPrimes.length; i++){
if(isPrimes[i] == true) count++;
}
return count;
}
}

还可以用DP来解决。

public class Solution {
public int countPrimes(int n) {

int count = 0;
int squareRoot = 1;
int number = 2;

List<Integer> list = new ArrayList<>();
for(int i = number; i < n; i++){
boolean isPrime = true;
if(squareRoot * squareRoot < i) squareRoot++;
for(int j = 0; j < list.size() && list.get(j) <= squareRoot;j++){
if(i%list.get(j) == 0){
isPrime = false;
break;
}
}
if(isPrime == true){
list.add(i);
count++;
}
}
return count;
}
}

Runtime: O(n*sqrt(n)/log(n))

最后,记录下最原始的求prime的方法 0-sqrt(n):

public class Solution {
public int countPrimes(int n) {

int count = 0;
int squareRoot = 1;
int number = 2;

for(int i = number; i < n; i++){
boolean isPrime = true;

for(int divisor = 2; divisor <= (int) (Math.sqrt(i)) ; divisor++){
if(i%divisor == 0){
isPrime = false;
break;
}
}
if(isPrime == true){
count++;
}
}
return count;
}
}

时间: 2024-11-21 00:02:00

Jan 09 - Count Primes; Mathematics; Optimization; Primes; DP;的相关文章

HDU4916 Count on the path(树dp??)

这道题的题意其实有点略晦涩,定义f(a,b)为 minimum of vertices not on the path between vertices a and b. 其实它加一个minimum index of vertices应该会好理解一点吧.看了一下题解,还有程序,才理清思路. 首先比较直接的是如果两点的路径没有经过根节点1的话,那么答案就直接是1,否则的话就必然有从根节点出发的两条路径,题解里说的预处理出f[u]表示不在根节点到u的路径上的点的最小值,然后取f[u]和f[v]的最小

Jan 09 - House Robber; DP;

用DP思维很好解决 注意终止条件 这里添加了一个数组 length = nums.length + 1; 代码: public class Solution { public int rob(int[] nums) { int[] money = new int[nums.length+1]; if(nums.length == 0) return 0; for(int i = 0; i <= nums.length; i++){ if(i == 0) money[i] = 0; else if

UVA1213Sum of Different Primes(素数打表 + DP)

题目链接 题意:选择k个素数,使得和为N(1120)的方案数: 筛选出 <= N 的素数,然后就背包 写的时候没初始dp[0][0] = 1;而且方案数也没相加,真是弱逼 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int Max = 1120; int prime[Max + 5], t

[usaco jan 09] 气象牛 baric [dp]

题面: 传送门 思路: 题意有点绕,实际上就是给你一个计算规则,让你取最少的元素,通过这个计算方式,得到一个小于指定误差上限的结果 这个规则分为三个部分,这里分别用pre,sum,suf表示 因为给定的元素个数(天数)很少,可以使用O(n^3)算法,因此考虑使用经过了预处理的dp解决问题 具体地,设dp[i][j]表示前i个元素使用了j个且一定取用了第i个时可能达到的最小误差值 预处理:pre[i]表示通过第一种计算方式得到的,第一个元素取第i个时得到的误差 suf[i]同理,为第三种计算方式

BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划( dp)

dp乱搞即可...( 我就是这样 A 的.. 后来想改快一点..然后就WA了...不理了 ------------------------------------------------------------------------------------------ #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define rep( i , n )

1363: Count 101 (经典数位dp)

1363: Count 101 Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 393     Solved: 154 Description You know YaoYao is fond of his chains. He has a lot of chains and each chain has n diamonds on it. There are two kinds

hdu 3336 count the string(KMP+dp)

题意: 求给定字符串,包含的其前缀的数量. 分析: 就是求所有前缀在字符串出现的次数的和,可以用KMP的性质,以j结尾的串包含的串的数量,就是next[j]结尾串包含前缀的数量再加上自身是前缀,dp[i]表示以i为结尾包含前缀的数量,则dp[i]=dp[next[i]]+1,最后求和即可. #include <map> #include <set> #include <list> #include <cmath> #include <queue>

Subsequence Count 2017ccpc网络赛 1006 dp+线段树维护矩阵

Problem Description Given a binary string S[1,...,N] (i.e. a sequence of 0's and 1's), and Q queries on the string.There are two types of queries:1. Flipping the bits (i.e., changing all 1 to 0 and 0 to 1) between l and r (inclusive).2. Counting the

【BZOJ1613】[Usaco2007 Jan]Running贝茜的晨练计划 DP

水DP. 设d[i][j]为i分钟疲劳为j f[i][j]=f[i-1][j-1]+f[i] f[i][0]=max(f[i-1][0], f[i-j][j]) 1 #include <iostream> 2 #include <cstdio> 3 #define N 10010 4 #define M 505 5 using namespace std; 6 int f[N][M],a[N]; 7 int n,m; 8 int main() 9 { 10 scanf("