我真的没有在刷水题呀
第一问答案为$1$
设$A(n)=\varphi\left(i^2\right)=i\varphi(i),B(n)=n$,则$C=A*B$,求得$C(n)=n^2$
两边求和
$$\begin{align*}\sum\limits_{i=1}^ni^2&=\sum\limits_{i=1}^ni\sum\limits_{d|i}\varphi(d)\\&=\sum\limits_{d=1}^n\sum\limits_{\substack{d|i\\i\leq n}}i\varphi(d)\\&=\sum\limits_{d=1}^n\sum\limits_{i=1}^{\left\lfloor\frac nd\right\rfloor}i\cdot d\varphi(d)\\&=\sum\limits_{i=1}^n\sum\limits_{d=1}^{\left\lfloor\frac ni\right\rfloor}i\cdot d\varphi(d)\\&=\sum\limits_{i=1}^ni\cdot A\left(\left\lfloor\dfrac ni\right\rfloor\right)\end{align*}$$
整理得$A(n)=\dfrac{n(n+1)(2n+1)}6-\sum\limits_{i=2}^ni\cdot A\left(\left\lfloor\dfrac ni\right\rfloor\right)$
上杜教筛即可
#include<stdio.h> #include<map> using namespace std; #define mod 1000000007 #define ll long long #define T 10000000 int phi[10000010],pr[10000010]; bool np[10000010]; int mul(int a,int b){return a*(ll)b%mod;} int ad(int a,int b){return(a+b)%mod;} int de(int a,int b){return(a-b)%mod;} void sieve(){ int i,j,m; phi[1]=1; np[1]=1; m=0; for(i=2;i<=T;i++){ if(!np[i]){ m++; pr[m]=i; phi[i]=i-1; } for(j=1;j<=m;j++){ if(pr[j]*(ll)i>T)break; np[i*pr[j]]=1; if(i%pr[j]==0){ phi[i*pr[j]]=phi[i]*pr[j]; break; }else phi[i*pr[j]]=phi[i]*(pr[j]-1); } } for(i=1;i<=T;i++)phi[i]=mul(i,phi[i]); for(i=2;i<=T;i++)phi[i]=ad(phi[i-1],phi[i]); } map<int,int>res; map<int,int>::iterator it; int dj(int n){ if(n<=T)return phi[n]; it=res.find(n); if(it!=res.end())return it->second; int i,nex,s; s=mul(mul(n,n+1),mul(n<<1|1,166666668)); for(i=2;i<=n;i=nex+1){ nex=n/(n/i); s=de(s,mul(mul(i+nex,500000004),mul(nex-i+1,dj(n/i)))); } return res[n]=s; } int main(){ sieve(); int n; scanf("%d",&n); printf("1\n%d",(dj(n)+mod)%mod); }