码迷,mamicode.com
首页 > 其他好文 > 详细

[HDU5608]function

时间:2018-03-03 10:52:38      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:sum   mes   for   时间复杂度   main   size   efi   second   iter   

题意:$n^2-3n+2=\sum\limits_{d|n}f(d)$,求$F(n)=\sum\limits_{i=1}^n f(i)$

emmmmm这个出题人怎么这么清真?

$$\begin{align*}\sum\limits_{i=1}^n\left(i^2-3i+2\right)&=\sum\limits_{i=1}^n\sum\limits_{d|i}f(d)\\\left(\sum\limits_{i=1}^ni^2\right)-3\left(\sum\limits_{i=1}^ni\right)+2n&=\sum\limits_{d=1}^nf(d)\left\lfloor\dfrac nd\right\rfloor\\\dfrac{n(n+1)(2n+1)}6-\dfrac{3n(n+1)}2+2n&=\sum\limits_{d=1}^nF\left(\left\lfloor\dfrac nd\right\rfloor\right)\\F(n)&=\dfrac{n(n-1)(n-2)}3-\sum\limits_{d=2}^nF\left(\left\lfloor\dfrac nd\right\rfloor\right)\end{align*}$$

用杜教筛筛一下即可

因为$f(n)=\sum\limits_{d|n}\mu(d)\left(\left(\dfrac nd\right)^2-3\left(\dfrac nd\right)+2\right)$,所以筛出$\mu$之后枚举$d$更新倍数即可预处理$F(n)$

我不太会算时间复杂度,但实测预处理到$10^6$的总计算次数是$9185685$次,不会超时

#include<stdio.h>
#include<map>
using namespace std;
#define ll long long
#define mod 1000000007
#define T 1000000
int pr[1000010],mu[1000010],f[1000010];
bool np[1000010];
int ad(int a,int b){return(a+b)%mod;}
int de(int a,int b){return(a-b)%mod;}
int mul(int a,int b){return a*(ll)b%mod;}
void sieve(){
	int i,j,m=0;
	np[1]=1;
	mu[1]=1;
	for(i=2;i<=T;i++){
		if(!np[i]){
			m++;
			pr[m]=i;
			mu[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)break;
			mu[i*pr[j]]=-mu[i];
		}
	}
	for(i=1;i<=T;i++){
		if(mu[i]==0)continue;
		for(j=1;i*(ll)j<=T;j++)f[i*j]=ad(f[i*j],mul(mu[i],mul(j-1,j-2)));
	}
	for(i=2;i<=T;i++)f[i]=ad(f[i],f[i-1]);
}
map<int,int>res;
map<int,int>::iterator it;
int dj(int n){
	if(n<=T)return f[n];
	it=res.find(n);
	if(it!=res.end())return it->second;
	int i,nex,s=mul(mul(n,n-1),mul(n-2,333333336));
	for(i=2;i<=n;i=nex+1){
		nex=n/(n/i);
		s=de(s,mul(nex-i+1,dj(n/i)));
	}
	return res[n]=s;
}
int main(){
	sieve();
	int t,n;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		res.clear();
		printf("%d\n",(dj(n)+mod)%mod);
	}
}

[HDU5608]function

标签:sum   mes   for   时间复杂度   main   size   efi   second   iter   

原文地址:https://www.cnblogs.com/jefflyy/p/8495694.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!