2016&2018

2016

大意就是给出m和n,求出所有的正整数对(a,b),1<=a<=m,1<=b<=n;a*b是2016的倍数;

1-2016 和 2017-4032 范围内的整数对个数相同,所以只求一个周期内即可。

typedef long long ll;
int main()
{
    ll m,n;
    while(scanf("%lld%lld",&m,&n)!=EOF)
    {
        int a=min((int)m,2016),b=min((int)n,2016);
        ll cnt=0;
        for(int i=1;i<=a;i++)
        {
            for(int j=1;j<=b;j++)
            {
                if(i*j%2016==0)
                {
                    cnt+=((m-i)/2016+1)*((n-j)/2016+1);
                }
            }
        }
        printf("%lld\n",cnt);
    }
    return 0;
}

2018

跟2016差不多,给定a,b,c,d,求出所有整数对 (m,n)其中 a<=m<=b,c<=n<=d,满足m*n%2018==0;

求 a 到 b 范围内 m 的倍数的个数:cnt = b / m + (a - 1) / m;

注意去重

typedef long long ll;
int main()
{
    ll a,b,c,d;
    while(scanf("%lld%lld%lld%lld",&a,&b,&c,&d)!=EOF)
    {
        ll ans=0;
        ll x[6]={0},y[6]={0};
        x[1]=b-a+1;
        y[1]=d-c+1;
 
        x[2]=b/2-(a-1)/2;
        y[2]=d/2-(c-1)/2;
 
        x[3]=b/1009-(a-1)/1009;
        y[3]=d/1009-(c-1)/1009;
 
        x[4]=b/2018-(a-1)/2018;
        y[4]=d/2018-(c-1)/2018;
 
        x[2]-=x[4];
        x[3]-=x[4];
        x[1]-=(x[2]+x[3]+x[4]);
        ans=x[1]*y[4]+x[2]*y[3]+x[3]*y[2]+x[4]*y[1];
        printf("%lld\n",ans);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值