欧拉函数确定1-n有多少个数和 n 互质详解 附C语言代码 蓝桥杯互质数的个数

本文主要是介绍欧拉函数确定1-n有多少个数和 n 互质详解 附C语言代码 蓝桥杯互质数的个数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 唯一分解定理

任意一个大于 1 的正整数都能被唯一地分解为质因数的乘积。

例如 8 = 2*2*2, 171 = 3*3*19, 30 = 2*3*5, 19 = 19。注意1既不是质数也不是合数。

为什么判断一个数是否是质数只要判断2-√n中有没有因数

24可以分解成 4*6,或者3*8,这两对因数中都是一个小于24的平方根,另一个大于,不可能两个数都小或者两个数都大,因此如果2-√n中找不到一个 n 的约数,那么在剩下的一半里也必定找不出两个数相乘等于 n,一定会是大于 n 的。

欧拉函数

解决的是1到 n 中有多少个数与 n 互质,函数长这样,看不懂先别急。

这一部分解释一下这个式子是怎么来的,可以跳过:

我们已知30 = 2*3*5,那么1-30中有多少个数与30互质就可以通过减去不和30互质的数得到,既然2、 3、 5不是,那他们的倍数也就不是,所以要减去 30/2、 30/3、 30/5,但是减的时候多减掉了2和3的公倍数、3和5的公倍数、2和5的公倍数,所以要再加上,就相当于有三个圆,两两相交,中间有一部分是三个圆重叠,所以还要再减去30/(2*3*5),最后整理一下就是 上面的式子了。

 下面我们来看个例子:

8可以分解成2*2*2,1-8中与8互质的数的个数应该,8*(1-1/2) = 4,恰好是1、 3 、 5 、7这四个数,同样地 6 也是如此。完整代码在后面。

 

一个正整数可以分解成素因数的乘积的形式,所以我们找到一个素因数之后要一直除这个数,例如12=2*2*3,我们发现 2 是12  的因数之后要一直除2,直到剩下3,才能找到下一个素因数,才可以根据公式乘下一个(1-1/p)。

另外还有一种情况比较特殊,即这个数本身就是一个素数,例如19只能分解成19,所以在2到平方根这个范围内没有任何素因数,for循环结束后还剩n,最后的结果就是n*(1-1/n)。其他情况下最后n应该除尽了,变成1.

#include <stdio.h>  
int main() 
{  int n=0;  scanf("%d", &n);  int res = n;  // 初始化结果为 n  for (int i = 2; i * i <= n; i++) {  if (n % i == 0) {    res /=  i * (i - 1);  while (n % i == 0) // 将 n 中的该素因子全部除尽  {  n /= i;  }  }  }  if (n > 1) {    res = res / n * (n - 1);  }  printf("%d\n", res);  return 0;  }

 学到这个是因为暴力判断有点费时间。

这篇关于欧拉函数确定1-n有多少个数和 n 互质详解 附C语言代码 蓝桥杯互质数的个数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/880681

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

spoj705( 求不相同的子串个数)

题意:求串s的不同子串的个数 解题思路:任何子串都是某个后缀的前缀,对n个后缀排序,求某个后缀的前缀的个数,减去height[i](第i个后缀与第i-1 个后缀有相同的height[i]个前缀)。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstrin

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)