2019牛客国庆集训派对day7 A 2016

本文详细解析了一个算法问题,目标是统计满足特定条件的正整数对(a,b)的数量,其中a和b分别不超过给定的n和m,且它们的乘积是2016的倍数。通过分析和代码实现,提供了理解此类问题的清晰路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题
题意:

给出正整数 n 和 m,统计满足以下条件的正整数对 (a, b) 的数量:

  1. 1≤a≤n,1≤b≤m;
  2. a×b是 2016 的倍数。

思路:

  1. a*b%mod–>(a%mod * b%mod)%mod;
  2. 设i=a%mod, j=b%mod(即1<=i,j<=mod,等于mod而不等于0的原因是0乘任何数都是0,然后取余的结果也是0),n里面对mod取余为i的数量是(n-i)/mod+1(+1是i本身)(PS:a%mod = i ==> a = k*mod+i,0<=k<=(n-i)/mod+1,所以n里面对mod取余为i的数量是(n-i)/mod+1)。

代码:
思路来源1来源2

#include<bits/stdc++.h>

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    ll ans = 0;
    for( int i=1; i<=min(n,2016); i++ ) {
        for( int j=1; j<=min(m, 2016); j++ ) {
            if( i*j%2016==0 ) {
                ans += (ll)((n-i)/2016+1)*(ll)((m-j)/2016+1);
            }
        }
    }
    cout << ans;
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值