质因数

欧拉函数

我们两清 提交于 2019-12-09 13:10:47
在数论,对正整数n,欧拉函数是少于或等于n的数中与n 互质 的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's totient function、 φ函数 、欧拉 商数 等。 例如φ(8)=4,因为1,3,5,7均和8 互质 。——————欧拉函数的定义 ---φ函数的值  通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有 质因数 ,x是不为0的整数。φ(1)=1(唯一和1 互质 的数(小于等于1)就是1本身)。 ( 注意:每种质因数只一个。比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4 ) ---若n是质数p的k次幂, φ(n)=p^k-p^(k-1)=(p-1)p^(k-1) -1 ,因为除了p的倍数外,其他数都跟n互质。 (证明:P^k有p*p*p....*p个p,共P^k个p) 设n为正整数,以 φ(n)表示不超过n且与n 互素 的正整数的个数,称为n的欧拉函数值,这里函数φ:N→N,n→φ(n)称为欧拉函数。 ----与N互质所有数的和:sum=n*φ(n)/2;//因为所有大于2的欧拉函数值都是偶数,所以/不会丢失数据 ----欧拉函数的证明: --容斥原理: A∪B∪C = A+B+C - A∩B - B∩C - C∩A +A∩B∩C

质因数分解

匆匆过客 提交于 2019-12-06 16:55:34
题目描述 已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。 输入描述: 输入只有一行,包含一个正整数n。 输出描述: 输出只有一行,包含一个正整数p,即较大的那个质数。 示例1 输入 复制 21 输出 复制 7 备注: 对于60%的数据,6≤n≤1000。 对于100%的数据,6≤n≤2*10^9。 解析: 说实话,看到这个题目是不是就觉得得分别判断这两歌树是不是质数。一开始我就想先暴力找到一个能被n整除的较小的质数,然后用n/min不就行了吗,可是后来一想,不对呀,不能保证大的数也是质数呀,于是,我就看了看数据,还是硬着头皮将这个想法敲上了,一提交竟然对了???黑人问号???可是后来一想,给出的这个数肯定能分解成两个质因数,而像24,100这样的数,肯定就不在考虑范围了。 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <string> 5 #include <cstring> 6 #include <cstdlib> 7 #include <cmath> 8 #include <stack> 9 #include <queue> 10 #include <set> 11 #include <map> 12 #include <vector> 13 #include

Project Euler 70: Totient permutation

人盡茶涼 提交于 2019-12-06 10:05:39
欧拉函数 \(\varphi(n)\) 计算小于 \(n\) 的自然数中和 \(n\) 互质的数的个数,比如1, 2, 4, 5, 7和8都小于9并且和9素质,因此 \(\varphi(9)=6\) 。1被认为和所有的正数素质,所以 \(\varphi(1)=1\) 。 有趣的是, \(\varphi(87109)=79180\) ,可以看到87109只是79180的重新排列。 求这样一个 \(n\) ,其中 \(1<n<10^7\) , \(\varphi(n)\) 是 \(n\) 的重新排列且 \(n/\varphi(n)\) 最小。 分析:上一题我们求了 \(n/\varphi(n)\) 最大时的 \(n\) 值,然而这一题要求 \(n/\varphi(n)\) 最小时的 \(n\) 值。要使得比值 \(n/\varphi(n)\) 最大,我们只需要在特定范围内找到一个数,它有最多的质因数即可。反之要使得比值 \(n/\varphi(n)\) 最小,则这个数的质因数数量应该尽量少。第一种情况是只有一个质因数,则这个数是一个质数,此时 \(\varphi(n)=n-1\) ,假设 \(n\) 的个位数为 \(d\) ,相应的个数为 \(c\) ,比如在313中有两个三,则 \(d=3,c=2\) ,则 \(\varphi(n)\) 中对应 \(d\) 的数的个数为 \(c-1\

欧拉工程第一至十题解题思路分析

不打扰是莪最后的温柔 提交于 2019-12-03 23:08:52
一、3或5的倍数(multiples of 3 and 5) 如果我们将小于10的所有是3或5倍数的自然数列出来,我们得到3,5,6和9,它们的和是23。与之类似,计算1000以下所有是3或5的倍数的自然数的和。 分析:此题至少有两种解法,第一种解法较为直接,将1000以下所有3或5的倍数列出再求即可,在python中使用列表推导式只需要一行代码即可。第二种思路是使用求和公式,分别求出1000以下所有三的倍数和五的倍数的和再减去十五的倍数的和,即: \[ s=\sum_{i=1}^{333}3i+\sum_{i=1}^{199}5i-\sum_{i=1}^{66}15i=\frac{3}{2}\cdot333(333+1)+\frac{5}{2}\cdot199(199+1)-\frac{15}{2}\cdot66(66+1) \] 第一种思路的实现代码如下: def main(): ans = sum([x for x in range(1,1000) if x%3==0 or x%5==0]) return ans 二、偶数斐波那契数(even Fibonacci numbers) 斐波那契序列中的数都是由前两项加总得出,假设第一与第二项为1与2,则前十项分别为: \[ 1,2,3,5,8,13,21,34,55,89 \] 考虑不超过四百万的斐波那契数

质因数分解的应用 codeforces 1247D

女生的网名这么多〃 提交于 2019-12-03 20:47:49
2019-11-06 传送门:: https://codeforces.com/contest/1247/problem/D 题意::有多少种组合方式满足乘积可以同x^k表示(k>=2) 思路::质因数分解,任何一个合数都可以拆成几个质因数之积; 对于一个数而言 拆解后可表示成 p1^k1 * p2^k2 * p3^k3······当k1,k2 ······满足为k的倍数时我们可以不用考虑,而对那些不为k的倍数的数我们是不是该想办法从其他数中找能配对成k的倍数的数,这样组合就存在了。 详情见代码:: 1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int maxn=1e5+5; 5 6 ll a[maxn],b[maxn]; 7 ll qpow(ll x,int p) 8 { 9 ll ans=1; 10 while(p){ 11 if(p&1){ans=ans*x;} 12 x=x*x; 13 p>>=1; 14 } 15 return ans; 16 } 17 map<ll,ll>mp; 18 int main() 19 { 20 int n,k; 21 scanf("%d%d",&n,&k); 22 for(ll i=1;i<=n;i++){ 23 scanf("

[算法/模板]质因数分解

冷暖自知 提交于 2019-12-01 20:29:58
[算法/模板]质因数分解 一、质因数分解的基本定理 \(\forall N \in (1,\infty)\) 都能唯一分解成有限个质数的乘积,可写作: \[N=P_1^{c_1}P_2^{c_2}...P_m^{c_m}\] 其中 \(c_i\) 为正整数, \(P_i\) 都是质数,且满足 \(P_1\lt P_2\lt ...\lt P_m\) 。 我们可以扫描2~ \(\sqrt N\) 的每个数k,若k能整除N,那么我们从N中除掉所有的因子k,同时累计被除去的k的个数。 因为一个合数的因子一定在扫描到这个合数之前就从N中被除去了,因此扫描到能整除N的数一定是质数。 需要注意的是,若最终N没有被[2, \(\sqrt N\) ]的数整除,则N为质数,直接累计就可以了。 综上,质因数分解的时间复杂度为 \(O(\sqrt N)\) 。 二、模板-质因数分解 代码如下: inline void Divide(){ cnt=0; for(int i=2;i<=sqrt(n);i++){ if(n%i==0){ p[++cnt]=i; while(n%i==0){ num[cnt]++; n/=i; } } if(n>1){ p[++cnt]=n;num[cnt]=1; } } }//其中p为底数,num为对应的指数 来源: https://www.cnblogs.com

洛谷$P2150\\ [NOI2015]$寿司晚宴 $dp$

南笙酒味 提交于 2019-12-01 06:53:19
正解:$dp$ 解题报告: 传送门$QwQ$. 遇事不决写$dp$($bushi$. 讲道理这题一看就感觉除了$dp$也没啥很好的算法能做了,于是考虑$dp$呗 先看部分分?$30pts$发现质因数个数贼少就考虑状压$dp$就完事鸭. 然后现在$100pts$,发现质因数个数太多就$GG$了. 但是这时候考虑显然每个数最多有一个$\geq \sqrt(n)$的质因数. 所以对质因数以$\sqrt(n)$为界分为两类,对大于等于$\sqrt(n)$的质因数$x$直接枚举,显然$x$的倍数只能放在一个集合中或不放,所以直接枚举这个$x$每次分别$dp$再合并起来就好. 具体来说,设$f_{i,j}$表示第一个人选的$\leq \sqrt(n)$的质因数集合为$i$,第二个选的为$j$的方案数.然后再设$g_{0/1,i,j}$为辅助$dp$数组,即枚举$x$的时候记录$x$的倍数不放到第二个集合/第一个集合的方案数. 然后注意下的是每次$g$转回$f$的时候递推式是$f_{i,j}=g_{0,i,j}+g_{1,i,j}-f_{i,j}$.就,因为两个$g$都会包含所有$x$的倍数都不选的情况,所以就要去重,发现重复的刚好是$f_{i,j}$,减去就好 $over$ 来源: https://www.cnblogs.com/lqsukida/p/11665023.html

算法 求一个数的质因数

两盒软妹~` 提交于 2019-11-30 23:36:17
题目描述 功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 ) 最后一个数后面也要有空格 详细描述: 函数接口说明: public String getResult(long ulDataInput) 输入参数: long ulDataInput:输入的正整数 返回值: String 输入描述: 输入一个long型整数 输出描述: 按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。 示例1 输入 复制 180 输出 复制 2 2 3 3 5思路:  1、2开始整除能除尽则是质因子  2、因为质因数顾名思义,即是质数也是因数,那么我们可以从2-sqrt(n)+1,求出其中的质数,然后以此判断能否被n整除。 #include <iostream> #include <algorithm> #include <string.h> #include <string> #include <map> using namespace std; string GetData(long index) {   int i = 2;   string ResStr = "";   while(index>=2){     if(index%i==0){        ResStr+=to_string(i)+" ";  

long long质因数分解模板

本小妞迷上赌 提交于 2019-11-28 03:58:56
#include <bits/stdc++.h> #define ll long long #define ull unsigned long long using namespace std; const ll inf = 1e18; const ll maxn = 1e18 + 4; typedef long double ld; const int N = 65, P = 5, prime[P] = {2, 3, 7, 61, 24251}; ll n, pn; ll f[N]; inline ll mul(ll a, ll b, ll p) { a %= p; b %= p; ll c = (ld)a*b/p; c = a * b - c * p; if(c < 0) c += p; else if(c > p) c -= p; return c; } inline ll ksm(ll x, ll y, ll p) { ll s = 1; while(y) { if(y & 1) s = mul(s,x,p); x = mul(x, x, p); y >>= 1; } return s; } inline ll twice(ll a, ll p) { ll d = p-1; int t = 0; while(!(d & 1)) d >>= 1, t++; ll x, y;

20190817B组

余生颓废 提交于 2019-11-27 16:10:47
20190817B组 T1 :100(100) 赛时: 一看数据范围 ,于是我就直接想到去爆搜一下。 先搜行再搜列,最后计算一下答案就行了。 算法: 搜索 T2 :100(100) 赛时: 吸取上一次比赛的经验,计算约数个数要用质因数指数+1再相乘这个公式。 于是就用 ,设 为对于 ! ,第 个质因数的个数。 初值: =分解质因数( ) 转移方程: %1000000009 答案: %1000000009 算法: dp T3 :0(0) 赛时: 看着时间不多了,想快速打个暴力就结束了。 可是一急脑子就卡了不知道斜率怎么计算。 最后暴力都没打出,只好打个表。 赛后: 算法: 排序 来源: https://blog.csdn.net/qq_41857193/article/details/99692819