PAT 1096. Consecutive Factors (20) 最长连续因子乘积 ,素数判断, 连续乘积问题的幂优化
2018-01-24 22:33
561 查看
/*************************
题意:
整数N可以分解为多个因数乘积
每个分解中都有连续的因子部分
求最长连续因子乘积
************************/
/***********************
解题思路:
遍历2到N
如果i是因子
则判断连续乘上i+1,i+2等数字后是否还是N的因子,按此判断
若能够判断出以i为开头的因子乘积长度,统计入maxlen。
优化措施:
1.当得知了maxlen后, 显然,如果i^(maxlen-1) > N 的话,其maxlen+1个连续乘积肯定会比N大,即肯定不存在了
2.如果N是素数,则就是他自身。
注意点:
1.是某个分解中的连续因子乘积,即你求出来的连续因子,必须是某个乘积分解中的
即不仅仅是这个数字可以被整除,而是连续的一段因子乘积都能被整除
*************************/
/***********************
笔记:
*********************/
#include<iostream>
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<stack>
#include<map>
#include<set>
#include<unordered_map>
using namespace std;
#define M 100009
#define INF 0x7ffffff
bool jugeprim(int n){
long long num = n;
for(long long i = 2;i * i <= num; i++){
if(num % i == 0)
return false;
}
return true;
}
long long GetPow(int x,int y){
long long ans = 1;
while(y--){
ans *= x;
}
return ans;
}
int main(){
int n, i,j;
cin>>n;
int L, R, len;
int maxlen = 0, ansL, ansR;
i = 2;
if(jugeprim(n)){
printf("1\n%d\n",n);
return 0;
}
int mul;
while(1){
if(GetPow(i,maxlen+1) > (long long)n){
break;
}
if( n % i == 0){
L = i;
R = i + 1;
mul = i;
while(n%(mul*R) == 0){
mul *= R;
R++;
}
len = R - L ;
if(len > maxlen){
maxlen = len;
ansL = L;
ansR = R;
}
i = i + 1 ;
}
else
i++;
}
cout<<maxlen<<endl;
for(i = ansL;i < ansR ;i++){
if(i != ansR - 1)
cout<<i<<"*";
else cout<<i<<endl;
}
return 0;
}
相关文章推荐
- PAT 1096. Consecutive Factors (20)(最大连续乘积因子)(sqrt(n)判断一个数是否为质数的深刻理解)
- PAT 1096 Consecutive Factors (暴力,最大连续乘积)
- PAT乙级1013. 数素数 (20) 判断素数代码
- [PAT甲级]1015. Reversible Primes (20)(可逆素数判断)
- PAT 1007. 素数对猜想 (20);判断一个数为素数;java实现
- PAT (Advanced Level) 1096. Consecutive Factors (20) 连续质因数
- PAT:4-3. 统计素数并求和(20)
- 最长公共子串(连续)问题
- PAT-A-1096. Consecutive Factors (20)
- PAT-乙级-1013. 数素数 (20)
- 编程题目:PAT 1008. 数组元素循环右移问题 (20)
- 边坡优化主题5——bzoj 1096 [ZJOI2007]仓库建设 解决问题的方法
- 7-1 最长连续递增子序列(20 分)
- java 判断一个数是素数(优化)
- PAT(乙) 1007. 素数对猜想 (20)
- PAT(B)1007. 素数对猜想 (20)
- PAT-A 1096. Consecutive Factors (20)
- PAT B1013. 数素数 (20)
- [C++]连续最长括号匹配问题
- 【PAT】(乙级)1013. 数素数 (20)