专栏:PAT乙级刷题笔记
题目
当自然数 n 依次取 1 、 2 、 3 、 … … 、 N 1、2、3、……、N 1、2、3、……、N 时,算式 ⌊ n / 2 ⌋ + ⌊ n / 3 ⌋ + ⌊ n / 5 ⌋ ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注: ⌊ x ⌋ ⌊x⌋ ⌊x⌋ 为取整函数,表示不超过 x x x 的最大自然数。)
输入格式
输入给出一个正整数 N ( 2 ≤ N ≤ 10 4 ) N(2≤N≤10 4 ) N(2≤N≤104)。
输出格式
在一行中输出题面中算式取到的不同值的个数。
输入样例
2017
输出样例
1480
分析
怀疑全网也没几个我这样的做法。看到这种题目下意识就是找数学关系。
令
f
(
n
)
f(n)
f(n)为取
n
n
n时,不同值的个数,那么显然当
m
o
d
(
n
−
1
,
i
)
=
0
mod(n-1,i)=0
mod(n−1,i)=0有
f
(
n
+
1
)
=
f
(
n
)
+
1
f(n+1)=f(n)+1
f(n+1)=f(n)+1,否则
f
(
n
+
1
)
=
f
(
n
)
f(n+1)=f(n)
f(n+1)=f(n),且
f
(
1
)
=
0
f(1)=0
f(1)=0。其中
i
=
2
、
3
、
5
i=2、3、5
i=2、3、5
于是一个递归就搞定了
代码
#include <iostream>
using namespace std;
int PAT(int n){
if(n == 0)
return 1;
else if((n%2 == 0)||(n%3 == 0)||(n%5 == 0))
return PAT(n-1)+1;
else
return PAT(n-1);
}
int main(){
int n;cin>>n;
cout<<PAT(n);
}