关于互质的小水题
题目描述
求1000以内与105互质的数
思路
__gcd至高无上
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int ans=0;
for(int i=1;i<=1000;i++)
{
if(__gcd(i,105)==1)ans++;
}
printf("%d",ans);
return 0;
}
水题,A了。
首先这是一道数奥题,这就意味着你无法使用C++等高级工具。
思路如下:
- 运用正难则反思想,把题目转化成1000以内和105有着公共质因子的数的个数。
- 对105进行分解质因数,拆成3、5、7。
- 接下来这一步是精华,我们去找质因子中含3、5或7的数,可以转化为
%3==0
,%5==0
,%7==0
三个集合。然后利用容斥原理,二交集分别是%(3*5)==0
、%(3*7)==0
、%(5*7)==0
,三交集只有%(3*5*7)==0
。 - 这里有一个显然的结论:1~n里面所有被p整除的数的数量为\(\lceil{n\over{p}}\rceil\),具体证明不多赘述。于是算出来前面所提及几个集合的数值,设f(x)代表这个集合的数值,有$$ans=f(3)+f(5)+f(7)-f(15)-f(21)-f(35)+f(105)$$
相信这个大家还是可以手算的,算出来是543。 - 最后不要忘了用1000减去这个数值才是正确答案。得到457,AC本题。
代码对拍:
正确性还是有的。