题目:以后补上。。。
分析:枚举求出n以内gcd为x的对数,求n以内gcd为x的对数就是求n/x以内gcd为1的对数,所以只要预先用欧拉线性筛法求出n以内的数欧拉函数,做个前缀和就行了。
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll N = 1e7+5;
const ll p = 1e9+7;
ll phi[N],s[N],cnt,vis[N],prim[N];
void init(){///欧拉线性筛模板
phi[1] = 1;
for(int i=2;i<=N;i++){
if(!vis[i]) {
phi[i] = i-1;
prim[++cnt] = i;
}
for(int j=1;j<=cnt;j++) {
int tp = prim[j];
if(i*tp>N) break;
vis[i*tp]=true;
if(i%tp==0) {
phi[i*tp]=phi[i]*tp; break;
}else phi[i*tp]=phi[i]*phi[tp];
}
}
s[1]=phi[1];
for(int i=2;i<N;i++)
s[i]=s[i-1]+2*phi[i];
}
int main(){
int n;
init();
while(cin>>n) {
ll ans=0;
for(ll i=1;i<=n;i++)
ans = (ans + s[n/i]*i%p*i%p)%p;
cout<<ans<<endl;
}
return 0;
}