题目:点击打开链接
题意:f(n) = sigma[1<=i<=n]sigma[1<=j<=i]ceil[i/j] (gcd(i,j)==1)
sigma代表求和符号,celi代表除完向上取整;
解题:个人觉得这个代码还挺容易看懂的
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const ll maxn=1e6+5;
int mu[maxn],prime[maxn],not_prime[maxn];
ll f[maxn],g[maxn],h[maxn];
void mobius()
{
ll tot;
mu[1] = 1;
tot = 0;
for(int i = 2; i < maxn; i++){
if(!not_prime[i]){
prime[++tot] = i;
mu[i] = -1;
}
for(int j = 1; prime[j]*i<maxn; j++){
not_prime[prime[j]*i] = 1;
if(i%prime[j]==0){
mu[prime[j]*i] = 0;
break;
}
mu[prime[j]*i] = -mu[i];
}
}
}//莫比乌斯函数的模板
void solve()
{
memset(g,0,sizeof(g));
memset(h,0,sizeof(h));
memset(f,0,sizeof(f));
for(int i=1;i<=1e6;i++)
{
g[i]++;
for(int j=i+1;j<=1e6;j+=i)
g[j]++;
}
for(int i=2;i<=1e6;i++)
g[i]=(g[i]+g[i-1])%mod;
for(int i=1;i<=1e6;i++)
{
for(int j=i;j<=1e6;j+=i)
{
h[j]=(h[j]+mu[i]*g[j/i]%mod+mod)%mod;
}
}
// cout<<h[1]<<endl;
for(int i=1;i<=1e6;i++)
{
f[i]=(f[i-1]+h[i])%mod;
}
}
int main()
{
int n;
mobius();
solve();
while(cin>>n)
{
cout<<f[n]<<endl;
}
return 0;
}