牛牛的“质因数”
题目来源牛客
链接:https://ac.nowcoder.com/acm/contest/9982/I
来源:牛客网
题目描述
**样例
解题思路
一开始我是先将范围内的素数全都筛出来,然后再将每个数用质因数的形式表达出来,但是超时了,后来看了别人写的发现可以在筛素数的时同时将每个数用“质因数”的形式表达出来。
比如
f[4]=f[2]10+2=22;
f[8]=f[22*2] => (f[2]10+2)10+2 => 222
…
f[22112] => f[221111] => ((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;
}