草爷要的数
Problem Description
今天校队队员们准备放松一下,我们队就准备选一些数字玩,然而每个人喜欢的数字是不同的,刻盘喜欢x(1<=x<=1^9),凯凯喜欢y(1<=y<=1^9),而我则喜欢z(1<=z<=1^9),争论不出结果的情况下,我们决定只要是这三个数中任意一个数的倍数我们都取,为了满足游戏要求,我们还决定只要[a,b]范围内的数(1<=a<=b<=1^18),请问满足要求的数一共有多少呢?
注:求a和b的最大公因数函数:
long long gcd(long long a,long long b){
return b?gcd(b,a%b):a;
}
注:求a和b的最大公因数函数:
long long gcd(long long a,long long b){
return b?gcd(b,a%b):a;
}
Input
多组数据(<=1000),请读到文件结尾。
每组数据一行5个整数,x,y,z,a,b,含义及数据范围如题目描述。
注意使用 long long
每组数据一行5个整数,x,y,z,a,b,含义及数据范围如题目描述。
注意使用 long long
Output
对于每组数据输出一个整数,表示满足要求的数的个数,每个结果占一行。
Sample Input
2 3 5 1 10 4 6 9 5 20 4 4 8 10 20
Sample Output
8 7 3
Author
容斥。。。
#include<stdio.h> //#include<bits/stdc++.h> #include<string.h> #include<iostream> #include<math.h> #include<sstream> #include<set> #include<queue> #include<map> #include<vector> #include<algorithm> #include<limits.h> #define inf 0x3fffffff #define INF 0x3f3f3f3f #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define LL long long #define ULL unsigned long long using namespace std; LL x,y,z,a,b; long long gcd(long long a,long long b) { return b?gcd(b,a%b):a; } long long lcm(long long n, long long m) { long long p = gcd(n, m); return (n/p*m); } LL SUM(LL x) { LL sum=0; sum+=(b/x)-(a-1)/x; return sum; } int main () { while(cin>>x>>y>>z>>a>>b) { LL sum_1=0,sum_2=0,sum_3=0; LL sum_4=0; LL sum_5=0; sum_1+=SUM(x); sum_2+=SUM(y); sum_3+=SUM(z); // cout<<lcm(x,y)<<endl; sum_4+=SUM(lcm(x,y))+SUM(lcm(x,z))+SUM(lcm(y,z)); sum_5+=SUM(lcm(lcm(x,y),lcm(y,z))); cout<<sum_1+sum_2+sum_3-sum_4+sum_5<<endl; } return 0; }