7-16 Alan的“质因数“

题目描述:
 

算数基本定理,又称唯一分解定理,算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积。

即N=p​1​e1​​∗p​2​e2​​...p​m​em​​(p1<p2<...<pm)

朴素的质因子分解算法就是利用了算数基本定理,依次枚举p判断N是否包含素因子p。

Alan最近对于质因数分解产生了浓厚的兴趣。

Alan定义了一个函数 F(x),它表示将 x 做质因数分解后得到的数字从小到大升序排列,然后将其“拼接”成一个大整数。 例如1500 = 2 * 2 * 3 * 5 * 5 * 5, F(1500) = 223555。

Alan现在给你一个数字N,请你求出 F(N) 的值。 由于这个结果可能非常大,所以你只用告诉Alan最终答案对 10​9​​+7 取余数的结果即可。

输入格式:

仅一行一个正整数 n(2≤n≤10​7​​)

输出格式:

仅一行,表示答案对 10​9​​+7 取余数的结果。

输入样例:

10

输出样例:

25

样例说明

F(10) = 2 * 5 = 25

输入样例:

8

输出样例:

222

样例说明

F(8) = 2 * 2 * 2 = 222

思路描述:

这道题就是分解质数,考点之一就是素数的筛选,考虑到运行效率,我用的是线性素数筛,先找出比给的数字n要小的素数,然后进行判断,用一个for循环,循环这个素数组,如果n能够整除,就放到一个专门存放质数的数组数组中,然后n除以这个素数,然后break,一直这样循环,直到n==1,那么就已经分解完毕,这时候需要注意,将质数拼接的话要考虑到如果这个质数大于10.就是需要另行解决,详情可以看代码。

代码如下:
 

#include <bits/stdc++.h>

using namespace std;
#define  mod 1000000007

long long prime[10000000];
bool isprime[10000000];
int x[100];
int judgeisprime(int x){
	int i,j;
	int count=0;
	memset(isprime,1,sizeof(isprime));
	for(i=2;i<=x;i++){
		if(isprime[i]==1)prime[++count]=i;
		for(j=1;j<=count;j++){
			if(prime[j]*i>x)break;
			isprime[i*prime[j]]=0;
			if(i%prime[j]==0)break;
		} 
	}
	return count;
}
bool cmp(int x,int y){
	return x<y;
}
int main(){
	long num;
	unsigned long long sum=0;
	cin >> num;;
	int i,j;
	int count=0,countx=0;
	count=judgeisprime(num);
	while(num>=2){
		for(i=1;i<=count;i++){
			if(num%prime[i]==0){
				x[countx++]=prime[i];
				num/=prime[i];
				break;
			}
		} 
	}
	sort(x,x+countx,cmp);
	for(i=0;i<countx;i++){
		long t=x[i];
		int m=1;
		while(t>=10){
			m*=10;
			t/=10;
		}
		sum=(sum*10*m+x[i])%mod;
	}
	cout << sum%mod;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值