2021牛客寒假算法基础集训营2

链接:链接
来源:牛客网

题目描述
算数基本定理,又称唯一分解定理,算术基本定理可表述为:任何一个大于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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ljw0925

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值