幸运数字(number)

Time Limit:1000ms   Memory Limit:64MB

 【题目描述】

  LYK最近运气很差,例如在NOIP初赛中仅仅考了90分,刚刚卡进复赛,于是它决定使用一些方法来增加自己的运气值。它觉得,通过收集幸运数字可以快速的增加它的RP值。它给幸运数字下了一个定义:如果一个数x能被3整除或被5整除或被7整除,则这个数为幸运数字。于是它想让你帮帮它在L~R中存在多少幸运数字。

 【输入格式】(number.in)

  第一行两个数L,R。

 【输出格式】(number.out)

  一个数表示答案。

【输入样例】

  10 15

【输出样例】

  4

【数据范围】

  对于50%的数据1<=L<=R<=10^5。

  对于60%的数据1<=L<=R<=10^9。

  对于80%的数据1<=L<=R<=10^18。

  对于90%的数据1<=L<=R<=10^100。

  对于另外10%的数据L=1,1<=R<=10^100。

  对于100%的数据L,R没有前导0。

【题目分析】

  从L到R中能被3 5 7整除的数字,那就算一下这个区间:3的倍数+5的倍数+7的倍数-15的倍数-35的倍数-21的倍数+105的倍数(容斥原理),要注意计算L之内的数的个数时,L不能算在内(跟 前缀和是同样的原理)

  我们会发现后面还有两组数据的R<=10^100T_T ,高精,弃了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
long long l,r;
int main()
{
    freopen("number.in","r",stdin);
    freopen("number.out","w",stdout);
    scanf("%I64d%I64d",&l,&r);
    l--;
    long long ans1=l/3+l/5+l/7-l/15-l/21-l/35+l/105;
    long long ans2=r/3+r/5+r/7-r/15-r/21-r/35+r/105;
    cout << ans2-ans1;
    fclose(stdin);fclose(stdout);
    return 0;
}
蒟蒻80

相关文章:

  • 2021-09-14
  • 2021-05-21
  • 2021-11-03
  • 2021-07-07
  • 2021-07-06
  • 2022-12-23
猜你喜欢
  • 2021-10-20
  • 2021-06-23
  • 2021-06-08
  • 2021-06-05
  • 2021-10-21
  • 2021-05-24
相关资源
相似解决方案