先说结论,这是一道与唯一分解定理有一定关系的题目

Part 1 分析题面

若题目说若 1a\frac{1} {a} 可化为一个有限的,不循环的小数,则称 aa 为终止数。

看到分数,自然而然地联想到唯一分解定理,那我们分解后再看怎样才能确定 1a\frac{1} {a} 是有限小数。

Part 2 证明

显而易见,只要一个分数可以化成 k10N\frac{k}{10^N}( kk 为整数)的形式,那么它就是一个有限小数。那我们的目的就变成了证明 1a=k10N\frac{1}{a} = \frac{k}{10^N}

如果说 aa 在分解质因数后只有 2255 两个质因数,即当 a=2m5na = 2^m \cdot 5^n 时,则 1a\frac{1} {a} 是有限小数,其他都是无限小数。

1.结论一:当 a=2^m·5^n 时,则 1/a 是有限小数

1. m>n

m>nm>n 时,我们需要补齐 55 的个数。给分子和分母同时乘以 5mn5^{m-n}

12m5n=15mn2m5n5mn=5mn2m5m=5mn(25)m=5mn10m\frac{1}{2^m \cdot 5^n} = \frac{1 \cdot 5^{m-n}}{2^m \cdot 5^n \cdot 5^{m-n}} = \frac{5^{m-n}}{2^m \cdot 5^m} = \frac{5^{m-n}}{(2 \cdot 5)^m} = \frac{5^{m-n}}{10^m}

2. m<n

m<nm<n 时,我们需要补齐 22 的个数。给分子和分母同时乘以 2nm2^{n-m}

12m5n=12nm2m2nm5n=2nm2n5n=2nm(25)n=2nm10n\frac{1}{2^m \cdot 5^n} = \frac{1 \cdot 2^{n-m}}{2^m \cdot 2^{n-m} \cdot 5^n} = \frac{2^{n-m}}{2^n \cdot 5^n} = \frac{2^{n-m}}{(2 \cdot 5)^n} = \frac{2^{n-m}}{10^n}

3. m=n

m=nm=n 时,分母已经是 10 的幂:

12m5m=110m\frac{1}{2^m \cdot 5^m} = \frac{1}{10^m}

在上述所有情况中,分数 1a\frac{1}{a} 最终都可以写成如下形式:

1a=K10N\frac{1}{a} = \frac{K}{10^N}

其中 KK 是一个整数, N=max(m,n)N = \max(m, n)

根据十进制计数法的定义,任何除以 10N10^N 的整数,其结果就是在该整数的末尾向前移动 NN 位小数点。因为 KK 是一个有限长度的整数,所以移动小数点后的结果必然是一个有限小数。

2.结论二:当不满足 a=2^m·5^n 时,则 1/a 不是有限小数

容易想到,如果说里边有一个其他的质数,则经过任意次操作,分数都不能写成 k10n\frac{k}{10^n} 的形式。

Part 3 编写代码

既然已经有了证明,那代码就简单多了,只需将 LLRR 中的数一一对比是否有 2255 之外的质因数数就可以了。

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<bits/stdc++.h>
using namespace std;
int l,r,ans;
int main(){
cin>>l>>r;
for(int i=l;i<=r;i++){
int a=i;
while(!(a%2))a/=2;
while(!(a%5))a/=5;
if(a==1)ans++;
}
cout<<ans;
}

p.s 本人就是今年三月考五级,当时定式思维了,以为涉及到质数的就用筛法,写的超麻烦。回家又看了一下,不禁感叹当时的自己怎么这么蠢。