G .2017(水题)

G.2017

题意:给你两个数据范围,x和y分别是这两个数据范围中的数,问你x*y有多少个是2017的倍数。
注意:整数(1,2)和整数(2,1)算是不同的,因为他们出自两个不同范围。

题解:我们先统计两个数据范围内的2017的倍数的个数,因为任何数*2017的倍数还是2017的倍数。

答案=第一个范围2017的倍数的个数 * 第二个范围长度+第二个范围2017的倍数的个数 * 第一个范围长度-算重的 (第一个范围2017的倍数的个数 * 第二个范围2017的倍数的个数 )

解释一下算重的:当你算第一个范围2017的倍数的个数 * 第二个范围长度,所有第一范围内的2017倍数的个数都乘上了第二个范围中的所有数,第二范围2017的倍数的个数也都乘上了第一范围的所有数,两次计算的时候两个范围内的2017的倍数的个数算了两遍。

一对数【x,y】 x永远是第一范围内的,y永远是第二范围的。

例如 第一范围内2017倍数为2017 4034 第二范围 4034 6051

第一个范围2017的倍数的个数 * 第二个范围长度:
【2017,4034】【2017,6051】【4034,4034】【4034,6051】

第二个范围2017的倍数的个数 * 第一个范围长度
【2017, 4034】【4034,4034】【2017,6051】【4034,6051】

很明显,这两个算重了,减去第一个范围2017的倍数的个数 * 第二个范围2017的倍数的个数。

代码很简单,需要理解。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
int main()
{
	ll a,b,c,d,p;
	while(cin>>a>>b>>c>>d)
	{
		ll num1=b/2017-(a-1)/2017;
		ll num2=d/2017-(c-1)/2017;
		
		cout<<num1*(d-c+1)+num2*(b-a+1)-num1*num2<<endl;

	}
	return 0;
 } 
发布了88 篇原创文章 · 获赞 30 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43667611/article/details/102212434