测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A25283. factorization问题描述Adleman非常喜欢数学,最近他遇到了一个棘手的问题:对于一个正整数A,Adleman发现一些自然数的质因子分解式中没有大于A的因子,这样的自然数非常的特殊。Adleman想知道对于给定的正整数A,一个区间[N, N+M]内所有满足上述条件的自然数的个数。输入说明第一行:3个用空格分开的整数N、M、A。输出说明第一行:一个整数,表示对于给定的正整数A,区间[N…

填空题 较易

题目描述

factorization

问题描述

Adleman非常喜欢数学,最近他遇到了一个棘手的问题:

对于一个正整数A,Adleman发现一些自然数的质因子分解式中没有大于A的因子,这样的自然数非常的特殊。Adleman想知道对于给定的正整数A,一个区间[N, N+M]内所有满足上述条件的自然数的个数。

输入说明

第一行:3个用空格分开的整数N、M、A。

输出说明

第一行:一个整数,表示对于给定的正整数A,区间[N, N+M]内特殊自然数的个数。

样例输入

30 10 5

样例输出

4

样例解释

[30, 40]之间的数质因子分解式如下:

30=2*3*5
31=1*31
32=2*2*2*2*2
33=3*11
34=2*17
35=5*7
36=2*2*3*3
37=1*37
38=2*19
39=3*13
40=2*2*2*5

其中30、32、36、40的质因子分解式中没有大于5的因子,所以一共有4个。

数据范围

50%的数据满足:1≤N,M,A≤5000

100%的数据满足:1≤N,M,A≤50,000

参考答案

#include <iostream> using namespace std; int main() { int n,m,a; cin>>n>>m>>a; m += n; int ans=0; for(int i=n; i<=m; i++) { int temp=i; for(int j=2; j*j<=temp && j<=a; j++) // 枚举到sqrt(i),否则会超时 { while(temp%j==0) temp /= j; } if(temp<=a) ans++; } cout<<ans<<endl; return 0; }

答案解析

从数学可知,一个正整数的质因子分解式是唯一的。

这里,我们可以利用“素数筛法”的思想,枚举区间内的每个数x,如果x能被最小的质数2整除,再去判断(x/2)是否也能被2整除(筛法思想:利用2将2的所有倍数全部筛掉);如此下去,如果(x/2)无法被2整除,再去判断它能否被第2小的质数3整除,依次类推。

上一题 下一题