此题也因为测评姬抖动的情况,有点轻微卡常,多交几次还是能过的
思路
- 可以先把10的倍数预处理
进行4e6的欧拉筛
然后对每个数进行分解质因数
分解质因数的时候我们可以把之前的数分解得出的答案存起来,对之后分解质因数进行优化
代码
// Problem: 牛牛的“质因数”
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/9982/I
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp(aa,bb) make_pair(aa,bb)
#define _for(i,b) for(int i=(0);i<(b);i++)
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,b,a) for(int i=(b);i>=(a);i--)
#define mst(abc,bca) memset(abc,bca,sizeof abc)
#define X first
#define Y second
#define lowbit(a) (a&(-a))
#define debug(a) cout<<#a<<":"<<a<<"\n"
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
typedef long double ld;
const int N=4e6+10;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
const double eps=1e-6;
const double PI=acos(-1.0);
ll f[N],g[105],ans;
string s[N];
int prime[N],cnt=0; //prime数组存放所以素数,cnt为素数个数
bool st[N]; //false为素数
void get_prime(int n){
for(int i=2;i<=n;i++){
if(!st[i]) prime[cnt++]=i; //把素数i存到prime数组中
for(int j=0;j<cnt&&i*prime[j]<=n;j++){
st[i*prime[j]]=true; //找到的素数的倍数不访问
if(i%prime[j]==0) break; //关键代码
}
}
}
string fenjie(int x){
string str="";
for(int i=0;i<cnt;i++){
int p=prime[i];
if(x%p==0){
x/=p;
str+=to_string(p);
}
if(x==1) break;
if(!st[x]){
str+=to_string(x);
break;
}
if(!s[x].empty()){
str+=s[x];
break;
}
}
return str;
}
void solve(){
int n;cin>>n;
get_prime(n);
// debug(cnt);
for(int i=2;i<=n;i++){
if(!st[i]) f[i]=i;
else{
s[i]=fenjie(i);
// debug(s);
int len=s[i].size()-1;
for(int j=0;j<=len;j++){
f[i]+=1ll*(s[i][j]-'0')*g[len-j]%mod;
f[i]%=mod;
}
}
}
rep(i,2,n) ans+=f[i],ans%=mod;
cout<<ans<<"\n";
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
// int t;cin>>t;while(t--)
g[0]=1;
rep(i,1,100) g[i]=g[i-1]*10,g[i]%=mod;
solve();
return 0;
}

京公网安备 11010502036488号