程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> codeforces The Wall - 題解

codeforces The Wall - 題解

編輯:C++入門知識

 

Iahub and his friend Floyd have started painting a wall. Iahub is painting the wall red and Floyd is painting it pink. You can consider the wall being made of a very large number of bricks, numbered 1, 2, 3 and so on.

Iahub has the following scheme of painting: he skips x?-?1 consecutive bricks, then he paints the x-th one. That is, he'll paint bricks x, 2·x, 3·x and so on red. Similarly, Floyd skips y?-?1 consecutive bricks, then he paints the y-th one. Hence he'll paint bricks y, 2·y, 3·y and so on pink.

After painting the wall all day, the boys observed that some bricks are painted both red and pink. Iahub has a lucky number a and Floyd has a lucky number b. Boys wonder how many bricks numbered no less than a and no greater than b are painted both red and pink. This is exactly your task: compute and print the answer to the question.

Input

The input will have a single line containing four integers in this order: x, y, a, b. (1?≤?x,?y?≤?1000, 1?≤?a,?b?≤?2·109,a?≤?b).

Output

Output a single integer — the number of bricks numbered no less than a and no greater than b that are painted both red and pink.

Sample test(s) input
2 3 6 18
output
3

 

這是一道簡單題,也隔了一段時間沒做簡單題目了。

這次感覺又不一樣了,可以很快就能寫出很優雅的代碼了,故此很想貼貼自己的代碼。

 

優雅代碼的關鍵就是要利用數學的思想去解:

本題的實質是可以轉化為求最大公倍數的的問題,然後利用Inclusion-exclusion(包含和不包含)的原則,計算有多少個數能被a除盡這個公倍數,有多少個數能被b除盡這個公倍數,然後相減就得到最終答案了。

 

#include 
using namespace std;

int TheWallGCD(int a, int b)
{
	while (b)
	{
		int t = b;
		b = a % b;
		a = t;
	}
	return a;
}

void TheWall340A()
{
	int x, y, a, b;
	scanf("%d %d %d %d", &x, &y, &a, &b);
	
	int r = TheWallGCD(x, y);
	r = x / r * y;

	int m = a % r? 0 : 1;

	printf("%d", b / r - a / r + m);
}


 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved