分解质因数

欧拉函数

走远了吗. 提交于 2020-04-04 03:54:08
一、质因数与分解质因数 ? 如果 一个质数是某个数的约数,那么就说这个质数是这个数的 质因数 。 把一个合数用质因数相乘的形式表示出来,叫做分解质因数。 例:把30分解质因数。 解:30=2×3×5。 其中2、3、5叫做30的质因数。 又如12=2×2×3=22×3,2、3都叫做12的质因数。 二、 公约数只有1的两个数,叫做 互质数 (欧拉函数是小于n的正整数中与n互质的数的数目) 列:1到8中 ,与8互质的数有:1、3、 5、 7 1到12中,与12互质的数有: 1、 5、 7、 11、 看了一下午的欧拉函数,感觉都快看崩溃了,还好找到一个看得懂的博客。。。。 https://www.cnblogs.com/linyujun/p/5194170.html 欧拉函数,用φ(n)表示 欧拉函数是求小于等于n的数中与n互质的数的数 可以先在1到n-1中找到与n不互质的数,然后把他们减掉 比如φ(12) 把12质因数分解,12=2*2*3,其实就是得到了2和3两个质因数 然后把2的倍数和3的倍数都删掉 2的倍数:2,4,6,8,10,12 3的倍数:3,6,9,12 本来想直接用12 - 12/2 - 12/3 但是6和12重复减了 所以还要把即是2的倍数又是3的倍数的数加回来 (>﹏<) 所以这样写12 - 12/2 - 12/3 + 12/(2*3) 这叫什么,这叫容斥啊

习题6.8 整除问题(分解质因数)

流过昼夜 提交于 2020-03-09 12:50:17
很好的一道题。由于n最大1000,1000的阶乘过于大,故直接计算出来再判断整除次数肯定是不行。 于是就想到了把n和a都分解质因数,幂次分别保留在不同数组中,针对a的质因数找出n和a这些质因数的幂次,看整体上n的幂次为a的幂次的多少倍。具体来说这些质因数中n的幂次都是a的幂次的倍数,找出最小的倍数即可满足。 #include <cstdio> #include <iostream> #include <algorithm> #include <string> #include <cstring> #include <vector> #include <stack> #include <cctype> #include <cmath> #include <climits> using namespace std; const int MAXN = 1005; const int INF = INT_MAX; bool isPrime[MAXN]; vector<int> prime; int prime1num[MAXN]; int prime2num[MAXN]; void Initial(){ for(int i = 2; i < MAXN; i++){ isPrime[i] = true; } for(int i = 2; i < MAXN; i++){ if(!isPrime

数论-分解质因数-POJ3421-X-factor Chains

时间秒杀一切 提交于 2020-03-01 17:46:34
数论-分解质因数-POJ3421-X-factor Chains 题目: 输入正整数 X,求 X 的大于 1 的因子组成的满足任意前一项都能整除后一项的严格递增序列的最大长度,以及满足最大长度的序列的个数。 输入格式 输入包含多组数据,每组数据占一行,包含一个正整数表示 X。 输出格式 对于每组数据,输出序列的最大长度以及满足最大长度的序列的个数。 每个结果占一行。 数据范围 1≤X≤220 输入样例: 2 3 4 10 100 输出样例: 1 1 1 1 2 1 2 2 4 6 题意: 对 给 定 正 整 数 X , 将 其 分 解 成 p 1 × p 2 × . . . × p n 的 形 式 , 求 从 序 列 p 的 子 序 列 a 中 , 满 足 a i ∣ a i + 1 , i > = 1 , 且 严 格 单 调 递 增 的 序 列 的 最 大 长 度 是 多 少 , 以 及 最 大 长 度 的 子 序 列 的 个 数 。 对给定正整数X,将其分解成\ p_1×p_2×...×p_n的形式,求从序列p的子序列a中,\\满足a_i|a_{i+1},i>=1,且严格单调递增的序列的最大长度是多少,以及最大长度的子序列的个数。 对 给 定 正 整 数 X , 将 其 分 解 成 p 1 ​ × p 2 ​ × . . . × p n ​ 的 形 式 , 求 从 序 列 p

4 【程序4 分解质因数】

别说谁变了你拦得住时间么 提交于 2020-02-09 00:48:19
题目:将一个大于 2 正整数分解质因数。例如:输入 3, 3=3, 输入 6, 6=2*3,输入 90, 90=2*3*3*5。 程序分析:对 n 进行分解质因数,应先找到一个最小的质数 k,然后按下述步骤完成: (1)如果这个质数恰等于 n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果 n<>k,但 n 能被 k 整除,则应打印出 k 的值,并用 n 除以 k 的商,作为新的正整数 n,重复执行第 一步。 (3)如果 n 不能被 k 整除,则用 k+1 作为 k 的值,重复执行第一步。 package 王道作业; import java.util.Scanner; public class 程序4分解质因数 { public static void main(String[] args) { // TODO Auto-generated method stub int num; int flag=0; Scanner in=new Scanner(System.in); num=in.nextInt();//输入一个数 for(int i=2;i<num;i++) { flag=1;//假设全是素数 if(num%i==0) { flag=0;//不是素数 num=num/i; System.out.print(i+" "); i=1; } } if(flag==1)

(C++/JAVA)分解质因数问题

荒凉一梦 提交于 2020-02-08 02:10:17
将一个合数分解质因数输出。 C++: # include <iostream> using namespace std ; bool ISSS ( int p ) { for ( int q = 2 ; q <= sqrt ( p ) ; q ++ ) { if ( p % q == 0 ) { return false ; } } return true ; } void FJZYS ( int a ) { if ( ISSS ( a ) == true ) { cout << a << " " ; } else { for ( int i = 2 ; i <= sqrt ( a ) ; i ++ ) { if ( a % i == 0 ) { cout << i << " " ; return FJZYS ( a / i ) ; } } } } int main ( ) { int a ; cin >> a ; FJZYS ( a ) ; } JAVA: /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template

(蓝桥杯)分解质因数

落爺英雄遲暮 提交于 2020-02-07 18:30:56
分解质因数 问题描述 求出区间[a,b]中所有整数的质因数分解。 输入格式   输入两个整数a,b。 输出格式   每行输出一个数的分解,形如k=a1 a2 a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例) 样例输入 3 10 样例输出 3=3 4=2 2 5=5 6=2 3 7=7 8=2 2 2 9=3 3 10=2 5 分析 一开始想的是先找出所有的素数,然后将这些素数一个个带入,用输入数据一次除这些素数,最后得到要求的因数。写完程序,代入系统,结果又超时了,运行超时是真的烦。本着不能浪费的原则,我这里还是贴出来看一看,毕竟能出结果的,就是慢了点,大家看看思路也还行。 质因数分解代码(超时) # include <iostream> using namespace std ; int k [ 10000 ] ; int jj [ 10000 ] ; int shuru [ 10000 ] ; int main ( ) { int a , b ; cin >> a >> b ; for ( int i = 0 ; i < b - a + 1 ; i ++ ) { shuru [ i ] = a + i ; } int n = 2 ; k [ 0 ] = 2 ; k [ 1 ] = 3 ; //筛选出范围内所有的素数 for ( int i = 2 ; i <=

分解质因数

痴心易碎 提交于 2020-01-30 20:44:04
1 #include <iostream> 2 using namespace std; 3 4 int main(){ 5 int n;genhao 6 cin >> n; 7 while(n --){ 8 int a; cin >> a; 9 //任何一个正整数最多只有一个大于根号n的质数 10 for(int i = 2;i <= a / i;++i){ 11 if(a % i == 0){//i 一定是质数genhao 12 int s = 0; 13 while(a % i == 0) a = a / i, ++s;//把i除干净 14 cout << i << " " << s << endl; 15 } 16 } 17 if(a > 1) cout << a << " " << 1 << endl;//因为最后一次分解a本身也有可能是一个质数, 如果不是质数a最后必然等于1 18 cout << endl; 19 } 20 return 0; 21 } View Code 来源: https://www.cnblogs.com/sxq-study/p/12243565.html

NOIP复习模拟赛day5

我怕爱的太早我们不能终老 提交于 2020-01-30 14:26:40
前言 今天的题目真TM的♂...... 题目 1.小半 ( h alf .pas/c/cpp) 【问题描述】 “释然、慵懒、尽欢, 时间风干后你与我再无关, 没答案,怎么办,看不惯自我欺瞒。 ” 灯火阑珊,释然的少年写下了n个正整数,它们的乘积为p。 月色旖旎,少年忽然想到,如果把 p再乘上一个正整数q能让它们的积为某个数的阶乘,则称这个数的阶乘为完美阶乘,这个数则为完美数,他厌倦了那些纷扰,只想要知道完美数的最小值,希望你能告诉他。 “灯火阑珊, 我的心借了你的光是明是暗。 ” ——《小半》 【输入】 共两行。 第一行一个正整数 n 。 第二行 n 个正整数 a[i],代表少年写下的n 个 数。 【输出】 共一行 一个正整数,代表完美数的最小值。 【输入输出样例】 1 6 3 样例解释:当p=6,q=1时,p*q=3! 【数据范围】 对于 10%的数据,n<=10 对于 30%的数据,n<=1000 对于 100%的数据,n<=100000,a[i]<=100000 官方题解: 10%~30%:各种暴力 100%:题目要求一个最小的m使m!包含p这个因子。 可以把p分解质因数,假设p=∏ai^bi(ai为质数),那么只要m!包含了每个ai^bi,m!就包含p。 所以对于每个ai^bi,分别求出满足条件的最小的m,取最大值即可。 怎么求m? 先看一个简单的问题: 27

蓝桥杯 基础练习 分解质因数(java)

时间秒杀一切 提交于 2020-01-24 01:12:10
问题描述   求出区间[a,b]中所有整数的质因数分解。 输入格式   输入两个整数a,b。 输出格式   每行输出一个数的分解,形如k=a1*a2*a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例) 样例输入 3 10 样例输出 3=3 4=2*2 5=5 6=2*3 7=7 8=2*2*2 9=3*3 10=2*5 提示   先筛出所有素数,然后再分解。 数据规模和约定   2<=a<=b<=10000 刚开始, 因为我提交的代码只有60分,超时了,虽然及格了,而且我感觉没什么可以改进的地方了,但谁让我有强迫症呢,一堆正确里混入一个超时,,我很难受。。我就去百度,看有没有什么更好的思路,随便找了几份代码直接提交后发现全都超时了,有一个只有10分。可能是他们没有用蓝桥杯的联系系统?或者没有VIP? 看来只能靠自己了,经过一番辛苦,在整体思路不变的情况下,调整代码结构,硬是搞成100了。 好,下面来说我的思路: 最主要的是用了欧拉筛筛出素数,关于欧拉筛,可以看这篇: 筛法求2到n的所有素数 代码整体是在欧拉筛的基础上改的,具体思路代码中有详细的注释。 贴上代码: import java . util . Scanner ; public class Main { public static void main ( String [ ] args ) {

1020. 分解质因数

只愿长相守 提交于 2020-01-18 03:17:34
Description 每一个大于等于2的自然数,均可写成一个或多个质数的乘积,例如: 2=2 20=2*2*5 这种将一个整数分割成若干个质数之积的操作叫做分解质因数。现在,给你一个整数N,请你编写一个程序,对其分解质因数。 Input Format 输入为一行,正整数N,保证 1 < N < 2147483647 。 Output Format 输出N的质因数分解形式,格式为 N=P1(E1)P2(E2)P3(E3).... 其中,P1、P2、P3、……为组成N的各个质因子, 满足P1 < P2 < P3 < ...;E1、E2、E3、……分别为P1、P2、P3、……在N中的指数。 例如: 20=2*2*5 应该输出成: 20=2(2)5(1) Hint N的大于sqrt(N)的质因子至多有一个。(sqrt(n)指N的开方取整) Sample Input 20 Sample Output 20=2(2)5(1) #include<iostream> using namespace std; bool mark[5000001]; int prime[5000001]; int num[5000001]={0}; int primesize; void init() { int i,j; primesize=0; for(i=2;i<=5000000;i++) { if(mark