Time Limit: 1.0 Seconds Memory Limit: 65536K
Total Runs: 1267 Accepted Runs: 400
Mysterious Number refers to a number which can be divisible by the number of distinct factors that it has. For instance, 1 (1 factor), 12 (6 factors) and 9 (3 factors) are Mysterious Numbers, but 7(2 factors) or 16 (5 factors) are not.
Given two integers low and high, please calculate the number of Mysterious Numbers between low and high, inclusive.
Input
For each test case, there are two integers low and high in one line separated by spaces.1 ≤ low ≤ high ≤ 1,000,000Output
Print out the number of Mysterious Numbers between low and high, inclusive.Sample Input
1 10 10 15
Sample Output
4 1
Author: WTommy
Source: TJU Team Selection Contest 2009 (4)
输入给出上下限low, high让你求[low,high]区间有多少个"神秘数".
我靠, 这题搁以前我一定枚举.但是.....呃.....呃..
好吧啊,这题就是埃式筛法.
两个循环可以求出1~100万所有数的约数个数.然后可以dp加速一下.转移
dp[i] = { dp[i-1], i不是神秘数
{ dp[i-1]+1, i是神秘数
然后每次询问low,high.输出dp[high] - dp[low-1]即可.
细节注意:0和1的约数个数处理.
| 0'00.08" | 8672K |
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAX = 1000000+1111;
int a[MAX] = {0,1};
int dp[MAX] = {0};
int main() {
fill(a+2, a+MAX, 2);
int i, j;
for (i = 2; i < (MAX>>1); ++i)
for (j = 2; i * j < MAX; ++j) {
++a[i*j];
}
//printf("%d\n", a[57896]); //57896 have 8 primes~
for (i = 1; i < MAX; ++i) {
dp[i] = dp[i-1] + (i % a[i] ? 0 : 1);
}
int low, high;
while (~scanf(" %d %d", &low, &high)) {
printf("%d\n", dp[high] - dp[low-1]);
}
return 0;
}
本文介绍了一种名为“神秘数”的数学概念,这类数能够被其自身不同因数的数量整除。文章提出了一种高效的算法——埃式筛法,用于找出指定范围内所有神秘数的数量,并通过动态规划进行了加速。
382

被折叠的 条评论
为什么被折叠?



