链接:链接
来源:牛客网
题目描述
算数基本定理,又称唯一分解定理,算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积。即N=p_1^{e_1}\cdot p_2{e_2}…p_m{e_m}(p_1 < p_2< … p_m)N=p
1
e
1
⋅p
2
e
2
…p
m
e
m
(p
1
牛牛最近对于质因数分解产生了浓厚的兴趣。
牛牛定义了一个函数F(x),它表示将x做质因数分解后得到的数字从小到大升序排列,然后将其“拼接”成一个大整数。
例如1500=22355*5,F(1500)=223555。
牛牛现在想要知道\sum_{i=2}^{n}F(i)∑
i=2
n
F(i)的值。
由于这个结果非常大,所以你只用告诉牛牛最终答案对10^9+710
9
+7取余数的结果即可。
输入描述:
仅一行一个正整数n(2 \leq n \leq 4 \times 10^6)n(2≤n≤4×10
6
)
输出描述:
仅一行,表示答案对10^9+710
9
+7取余数的结果。
示例1
输入
复制
3
输出
复制
5
说明
示例2
输入
复制
10
输出
复制
342
说明
F(2)=2
F(3)=3
F(4)=22
F(5)=5
F(6)=23
F(7)=7
F(8)=222
F(9)=33
F(10)=25
2+3+22+5+23+7+222+33+25=342
题意
题意很好理解,从2到n,求每个数所有质数因子从小到大排列后组成的大数的和
这道题一开始是想着先欧拉筛出范围内的所有质数,然后对2-n的每一个数拆分求和结果t了,想来应该是拆一个数的质因子最坏情况有超过1e4的问题了
后来换一种思路,对于任意一个已经求好其质因子的数,在保证结果不超过n 的情况下,可以乘以所有已经求出来的质数,即可以用bfs的思维解决这道题
注意
因子需要从小到大排序,所以需要存下最后一个因子的下表,bfs时只能乘不小于最后一个因子的数
判断相乘后的结果有没有超过n时可能会爆int,这里要记得处理
代码
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
const int inf=0x3f3f3f3f;
#define ll long long
#define ull unsigned long long
#define mm(w,v) memset(w,v,sizeof(w))
#define f(x,y,z) for(int x=(y),_=(z);x<_;++x)
const int modn=1e9