看到有佬dfs过,我太菜了
题目大意:
求如下函数,F[x]=x的每一位上的数;eg:F[120]=1+2+0=3
答案:![](https://img-blog.csdnimg.cn/fbe2cea061914422b23b30121c033cae.png)
最后就暴力跑n,然后跑b/d就好了(预处理出F数组,还有莫比乌斯函数mu)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll cnt=0;
const ll N=1e5+10;
ll prime[N],mu[N];
ll sum[N],f[N];
bool vis[N];
void init(){//线性筛,同时求莫比乌斯函数
for(ll i=1;i<=N;++i){
ll k=i;
while(k)f[i]+=k%10,k/=10;
}
mu[1]=1;
for(ll i=2;i<N;++i){
if(!vis[i]){
prime[++cnt]=i;
mu[i]=-1;
}
for(ll j=1;j<=cnt&&i*prime[j]<N;++j){
vis[prime[j]*i]=1;
if(i%prime[j])mu[i*prime[j]]=-mu[i];
else{
mu[i*prime[j]]=0;
break;
}
}
}
}
signed main(){
init();
ll n;scanf("%lld",&n);
ll ans=1;
for(ll d=1;d<=n;++d){
ll k=0;
for(ll i=1;i<=(ll)(n/d);++i){
sum[i]=sum[i-1]+f[i*d];
}
for(ll i=1;i<=n/d-1;++i)
k+=sum[i];//相当于求前缀和
//cout<<"k="<<sum[n/d-1]<<endl;
ans+=mu[d]*k;
//cout<<"ans="<<ans<<endl;
}
cout<<ans;
}