幸运数字(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; }