题目链接
思路:
a
b
\frac{a}{b}
ba若在十进制下是有限小数的话等价于:存在非负整数
x
,
y
x,y
x,y 使得
2
x
5
y
a
m
o
d
b
=
0
2^x5^ya\mod b =0
2x5yamodb=0
那我们枚举分子,看每个分子的贡献是多少。
那么一个数
P
=
p
1
x
1
∗
p
2
x
2
.
.
.
.
.
.
.
.
p
k
−
2
x
k
−
2
∗
2
x
k
−
1
∗
5
x
k
P=p_1^{x_1}*p_2^{x_2}........p_{k-2}^{x_{k-2}}*2^{x_{k-1}}*5^{x_k}
P=p1x1∗p2x2........pk−2xk−2∗2xk−1∗5xk,其中
p
1
,
p
2
.
.
.
.
p_1,p_2....
p1,p2....为质数,那么
P
P
P的贡献就等于
Q
=
p
1
x
1
∗
p
2
x
2
.
.
.
.
.
.
.
.
p
k
−
2
x
k
−
2
Q=p_1^{x_1}*p_2^{x_2}........p_{k-2}^{x_{k-2}}
Q=p1x1∗p2x2........pk−2xk−2的贡献。
我们整除分块,在一个区间
[
l
,
r
]
[l,r]
[l,r]中的任意整数
z
z
z,
D
=
⌊
c
x
⌋
D=\lfloor \frac{c}{x}\rfloor
D=⌊xc⌋,我们需要容斥掉区间内所有2或5的倍数,剩下的数每个的贡献都是
D
D
D,另外由于每个数再乘上一些2或5之后的贡献还是
D
D
D,那么我们可以先预处理出所有只包含2,5质因子的数,然后递增排序,由于整除分块的区间递增,所以我们可以用一个指针来维护当前区间可以乘多少个只包含2,5质因子的数。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 555 + 10;
#define fi first
#define se second
#define pb push_back
LL c,d[N];
LL com(LL x){
return x/2+x/5-x/10;
}
int co;
int main() {
ios::sync_with_stdio(false);
cin>>c;
for(LL i=1;i<=c;i*=2){
for(LL j=i;j<=c;j*=5){
d[++co]=j;
}
}
sort(d+1,d+1+co);
LL cnt=0;
for(register LL i=1,j;i<=c;i=j+1){
j=min(c,c/(c/i));
LL l=i,r=j,add=c/i;
while(co&&d[co]>add)co--;
cnt+=(r-l+1-com(r)+com(l-1))*add*co;
}
cout<<cnt<<'\n';
return 0;
}