关于互质的小水题

题目描述

求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++等高级工具。
思路如下:

  1. 运用正难则反思想,把题目转化成1000以内和105有着公共质因子的数的个数。
  2. 对105进行分解质因数,拆成3、5、7。
  3. 接下来这一步是精华,我们去找质因子中含3、5或7的数,可以转化为%3==0%5==0%7==0三个集合。然后利用容斥原理,二交集分别是%(3*5)==0%(3*7)==0%(5*7)==0,三交集只有%(3*5*7)==0
  4. 这里有一个显然的结论: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。
  5. 最后不要忘了用1000减去这个数值才是正确答案。得到457,AC本题。
    代码对拍:
    image
    正确性还是有的。
posted @ 2024-07-11 15:56  一位很会的教授er~  阅读(19)  评论(0编辑  收藏  举报