luogu P6583 回首过去

题目链接
思路: 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=p1x1p2x2........pk2xk22xk15xk,其中 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=p1x1p2x2........pk2xk2的贡献。
我们整除分块,在一个区间 [ 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值