[BZOJ4916]神犇和蒟蒻

Posted jefflyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[BZOJ4916]神犇和蒟蒻相关的知识,希望对你有一定的参考价值。

我真的没有在刷水题呀

第一问答案为$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);
}

以上是关于[BZOJ4916]神犇和蒟蒻的主要内容,如果未能解决你的问题,请参考以下文章

bzoj4916 神犇和蒟蒻

BZOJ4916神犇和蒟蒻 杜教筛

BZOJ4916神犇和蒟蒻(杜教筛)

bzoj4916 神犇和蒟蒻

[BZOJ4916]神犇和蒟蒻

BZOJ4916神犇和蒟蒻 杜教筛