csu 1803 2016 2016湖南省赛 A

本文介绍了一道算法题目,求满足条件1≤a≤n,1≤b≤m且a*b%2016=0的整数对(a, b)的数量。通过分析发现,关键在于a和b对2016取余后的乘积是否能被2016整除,并给出了解决方案的代码实现。

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

Problem

acm.csu.edu.cn/csuoj/problemset/problem?pid=1803

vjudge.net/contest/161962#problem/A

Reference

www.cnblogs.com/wuwangchuxin0924/p/5838984.html

Meaning

问有多少个整数对(a,b),满足:1 <= a <= n,1 <= b <= m,a * b % 2016 = 0

Analysis

a = 2016 * x + i

b = 2016 * y + j

a * b = 2016 * ( 2016 * x * y + y * i + x * j ) + i * j

可见 a * b 能否整除 2016 取决于 i * j 是否整除 2016。

枚举 a 和 b 对 2016 的余数的乘积 i * j,如果这一对乘积能整除 2016,那么所有对 2016 余数为 i 和 j 的数相乘就都整除 2016。

Code

#include <iostream>
using namespace std;
const int MOD = 2016;

inline long long cal(int rest, int top)
{
	/* a 和 b 都不能为零,要特判 */
	return top / MOD + (rest && top % MOD >= rest);
}

int main()
{
	ios::sync_with_stdio(false);
	int n, m;
	while(cin >> n >> m)
	{
		long long ans = 0;
		for(int i=0; i<MOD; ++i)
			for(int j=0; j<MOD; ++j)
				if(i * j % MOD == 0)
					ans += cal(i, n) * cal(j, m);
		cout << ans << '\n';
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值