题目描述:
算数基本定理,又称唯一分解定理,算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积。
即N=p1e1∗p2e2...pmem(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最终答案对 109+7 取余数的结果即可。
输入格式:
仅一行一个正整数 n(2≤n≤107)
输出格式:
仅一行,表示答案对 109+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;
}