2018 湘潭邀请赛 K.2018

题意:
给出 a,b,c,d
问有多少个组合(i,j)

i*j%2018==0,a<=i<=b,c<=j<=d:

分析:求出 a到b 有多少个数是1、2、1009、2018的倍数,依次 p11,p12,p13,p14

          求出 c到d 有多少个数是1、2、1009、2018的倍数,依次 p21,p22,p23,p24

符合条件的乘法运算有,

1. 2018的倍数乘以任意数,即p14*p21+p24*p11.

2. 1009的倍数(奇数倍)乘以任意偶数,即(p13-p14)*p22+(p23-p24)*p12.

注意:2018的倍数乘以任意数,与1009的奇数倍乘以任意偶数,有部分重复计数的

1. p14*p24,左边的2018的倍数乘以右边的2018的倍数

2. p14*(p23-p24) 左边的2018倍数乘以右边的1009的奇数倍

3. p24*(p13-p14) 右边的2018倍数乘以左边的1009的奇数倍

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int main(){
    long long p11,p12,p13,p14;
    long long p21,p22,p23,p24;
    long long a,b,c,d,sum;
  // 求出 a到b 有多少个数是1、2、1009、2018的倍数,依次 p11,p12,p13,p14
   //求出 c到d 有多少个数是1、2、1009、2018的倍数,依次 p21,p22,p23,p24
    while(~scanf("%lld %lld %lld %lld",&a,&b,&c,&d)){
          p11=b-a+1;
          p12=b/2-a/2+(a%2?0:1);//p12记的是是2的倍数的数的数量,当a是2的倍数时,(b/2-a/2)在计算不会把a进去,所以要判定。
          p13=b/1009-a/1009+(a%1009?0:1);//同上
          p14=b/2018-a/2018+(a%2018?0:1);
          p21=d-c+1;
          p22=d/2-c/2+(c%2?0:1);
          p23=d/1009-c/1009+(c%1009?0:1);
          p24=d/2018-c/2018+(c%2018?0:1);
          //printf("%lld %lld %lld %lld\n",p11,p12,p13,p14);
          //printf("%lld %lld %lld %lld\n",p21,p22,p23,p24);
          sum=p11*p24+p21*p14+(p13-p14)*(p22)+(p23-p24)*(p12)-(p13-p14)*p24-p14*(p23-p24)-p14*p24;
          printf("%lld\n",sum);
    }
}

猜你喜欢

转载自blog.csdn.net/jxufe_acmer/article/details/80315840