1. 程式人生 > >51nod 1284 2 3 5 7的倍數

51nod 1284 2 3 5 7的倍數

題目

解題思路:

使用容斥原理;

1.求出所有1~N中所有為2的倍數,3的倍數,5的倍數,7的倍數的個數,在求得的結果中肯定有些是重複的;

2.要減去第一步中重複的哪些數字。如何求重複的那些數字呢?求兩兩的最小公倍數。

例如:1~N中滿足2的倍數的個數有N/2個,滿足3的倍數的個數有N/3個,既滿足2的倍數有滿足3的倍數的個數為N/6個,

則1~N中是2,3的倍數的個數為N/2+N/3-N/6。

後面也用同樣的方法,直到最後所有數的最小公倍數只有1個時,就不用接著往下算啦!(看了程式碼後一目瞭然)

原始碼附上:

#include <iostream>
using namespace std;

int main()
{
	long long N,cnt=0;
	int i;
	cin>>N;
    cnt += (N/2 + N/3 + N/5 + N/7);
    cnt -= (N/6 + N/10 + N/14 + N/15
            + N/21 + N/35);
    cnt += (N/30 + N/42 + N/70 + N/105); 
    cnt -= (N/210);
    cout << N - cnt<<endl;
	return 0;
}