2021-03-06

牛牛的“质因数”

题目来源牛客
链接:https://ac.nowcoder.com/acm/contest/9982/I
来源:牛客网

题目描述
在这里插入图片描述
**样例在这里插入图片描述
解题思路
一开始我是先将范围内的素数全都筛出来,然后再将每个数用质因数的形式表达出来,但是超时了,后来看了别人写的发现可以在筛素数的时同时将每个数用“质因数”的形式表达出来。
比如
f[4]=f[2]10+2=22;
f[8]=f[2
2*2] => (f[2]10+2)10+2 => 222

f[22112] => f[22
11
11] => ((f[2]*10+2)*100+11)*100+11=221111
至于是乘以10还是100还是1000,等等,主要看的是该素数是几位数

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const ll MAX_N=4*1e6+5;
const ll MOD=1e9+7;
ll f[MAX_N];
ll k=0;
ll calc(int x){
	ll ans=10;
	for(int i=0;i<x;i++)
		ans*=10;
	return ans;	
}
int main(){	
	ll n;
	ll res=0;
	memset(f,0,sizeof(f));
	scanf("%lld",&n);
	for(ll i=2;i<=n;i++)
	{
		if(f[i]==0)
		{
			f[i]=i;
			for(ll j=2*i;j<=n;j+=i) 
				f[j]=(f[j/i]*calc(log10(i))+i)%MOD;
		}
	}
	for(int i=2;i<=n;i++){
		res=(res+f[i])%MOD;
	}
	printf("%lld\n",res);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值