题解 CF630K 【Indivisibility】
zengzhijie54188 · · 题解
这道题其实是一道普通的容斥原理
解法
题目是想知道
所以我们可以先定义一个数,把它赋值为输入的那个数,然后减去能被
long long n ;
cin >> n ;
long long s = n ;
s -= n / 2 + n / 3 + n / 5 + n / 7 ;
然后我们会疑惑,为什么算出来是个负数,其实,想到容斥原理我们可以发现(如图),当我们在减去
,经过思考,我们可以知道,在第一次减去四个数的分别倍数的个数的时候,减去了三次,第二次加上的时候也加上了三次,所以我们要再减一次。
!
#include<bits/stdc++.h>
using namespace std ;
int main()
{
long long n ;
cin >> n ;
long long s = n ;
s -= n / 2 + n / 3 + n / 5 + n / 7 ;
s += n / 6 + n / 10 + n / 14 + n / 15 + n / 21 + n / 35 ;
s -= n / 30 + n / 105 + n / 42 + n / 70 ;
s += n / 210 ;
cout << s ;
}
真心希望能帮助到大家!