2017年四川省赛 -- G题 2017 【容斥定理】

题意 : 就是在两个区间中选择一些数, 使得他们的乘积是2017的倍数. 问这样的点对一共有多少对.

思路 :因为2017是质数,所以我们只需要考虑2017的倍数就好,只有存在2017的倍数才能组成2017的倍数,所以我们只需要简单的容斥一下,首先找到a,b这个区间里面有多少个2017的倍数 s1,再找到c,d这个区间有多少个2017的倍数s2,再减掉重复的就好. 即s1乘c,d区间长度,s2乘a,b区间长度(因为这个数是2017的倍数,乘任何一个数都是2017的倍数),然后减去重复的s1*s2就好了. 看清楚题意.!!!

AC Code

#include
#define ll long long
using namespace std;
#define X 5
int main()
{
    ll a,b,c,d;
    while(~scanf("%lld%lld%lld%lld",&a,&b,&c,&d)){
        ll s1 = b/X - (a-1)/X;
        ll s2 = d/X - (c-1)/X;
        ll res = s1 * (d-c+1) + s2 * (b-a+1) - s1*s2;
        printf("%lld\n",res);
    }
}

你可能感兴趣的:(容斥定理)