我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
利用动态规划,来计算下一个最小丑数;
int nthUglyNumber(int n) { int dp[n + 1]; dp[0] = 1; int p2 = 0, p3 = 0, p5 = 0; for (int i = 1; i < n; i++) { int num2 = dp[p2] * 2, num3 = dp[p3] * 3, num5 = dp[p5] * 5; dp[i] = fmin(fmin(num2, num3), num5); if (dp[i] == num2) { p2++; } if (dp[i] == num3) { p3++; } if (dp[i] == num5) { p5++; } } return dp[n-1]; }
给定整数
n
,返回 所有小于非负整数n
的质数的数量 。#define ll long long int countPrimes(int n){ int f[5000000]={0}; int i; int cnt = 0; ll j; f[0] = f[1] = 1; for(i = 2; i < n; ++i) { if(!f[i]) { ++cnt; for(j = (ll)i * i; j < n; j += i) { f[j] = 1; } } } return cnt; }
可以利用艾筛法进行统计;
请你帮忙给从 1 到 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;你需要返回可能的方案总数。
让我们一起来回顾一下「质数」:质数一定是大于 1 的,并且不能用两个小于它的正整数的乘积来表示。
由于答案可能会很大,所以请你返回答案 模 mod 10^9 + 7 之后的结果即可。
#define N 1000000007 int isprime(int x){ if (x==1) return 0; for (int i=2;i<=sqrt(x);i++){ if (x%i==0) return 0; } return 1; } long factorial(int n){ //乘积可能超出int范围,所以用long; if (n<=1) return 1; else return n*factorial(n-1)%N;//注意取模 } int numPrimeArrangements(int n){ int i,num,prime=0; for (i=1;i<=n;i++){ if (isprime(i)) prime++; } num=factorial(prime)*factorial(n-prime)%N;//注意取模 return num; }
分别统计质数的全排列和合数的全排列,两数相乘即为正确答案;