51nod 1227 平均最小公倍数
来源:互联网 发布:网络摄像机ip设置方法 编辑:程序博客网 时间:2024/06/06 00:46
51nod 1227 平均最小公倍数
原题链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1227
A(n)=1n∑i=1nlcm(i,n)
∑k=1nA(k)=∑k=1n1k∑i=1klcm(i,k)=∑k=1n1k∑i=1kkigcd(i,k)=∑k=1n∑i=1kigcd(i,k)=∑k=1n∑d|k∑i=1kid[gcd(i,k)=d]=∑k=1n∑d|k∑i=1kdi[i⊥kd]
对于计算[1,n] 与n互素的数字之和可以类比等差数列的倒叙相加。
因为 a⊥n 则:(n−a)⊥n
所以:∑i=1n[i⊥n]i=φ(n)∗n2
特别的,n=1 时:∑i=1n[i⊥n]i=φ(n)∗n+12
所以:∑k=1n∑d|k∑i=1kdi[i⊥kd]=∑k=1n(12+∑d|kφ(d)d2)=n2+12∑d=1nφ(d)d⌊nd⌋
令:g(n)=φ(n)nidk(n)=nk
显而下面的狄利克雷积成立:g∗id1=id2
f 的前缀和为:Sf
则:Sg(n)=n(n+1)(2n+1)6−∑i=2niSg(⌊ni⌋)
那么对于:∑d=1nφ(d)d⌊nd⌋=∑L=1m−1L(Sg(⌊nL⌋)−Sg(⌊nL+1⌋))+∑d=1⌊nm⌋g(d)⌊nd⌋
代码:
#include <stdio.h>#include <algorithm>#include <string.h>#include <cmath>#define MAXN 1000000#define SQR 40000#define S(a) ((LL)(a)*((a)+1)%P*Iv[2]%P)using namespace std;typedef long long LL;const int P=1e9+7;int tmp[SQR];int g[MAXN];int phi[MAXN];int Iv[SQR];void init (){ Iv[1]=1; for(int i=2;i<SQR;i++)Iv[i]=(P-(LL)Iv[P%i]*(P/i)%P)%P; for(int i=1;i<MAXN;i++) { phi[i]=i-phi[i]; for(int j=i<<1;j<MAXN;j+=i)phi[j]+=phi[i]; phi[i]=(LL)phi[i]*i%P; g[i]=phi[i]+g[i-1]; if(g[i]>=P)g[i]-=P; }}void clat(int n,int d){ int m=sqrt(n)+1,ans=0; for(int L=1;L<m;L++) { ans+=(LL)g[L]*((S(n/L)-S(n/(L+1))+P)%P)%P; if(ans>=P)ans-=P; } for(int i=n/m;i>1;i--) { int u=n/i; if(u<MAXN) ans+=(LL)g[u]*i%P; else ans+=(LL)tmp[i*d]*i%P; if(ans>=P)ans-=P; } m=(LL)n*(n+1)%P*(2*n+1)%P*Iv[6]%P; tmp[d]=(P+m-ans)%P;}void sum(int n){ if(n<MAXN)return ; for(int i=n/MAXN;i;i--)clat(n/i,i); return ;}int solve(int n){ sum(n); int m=sqrt(n)+1,ans=0; for(int L=1;L<m;L++) { int u1=n/L; int u2=n/(L+1); if(u1<MAXN) u1=g[u1]; else u1=tmp[L]; if(u2<MAXN) u2=g[u2]; else u2=tmp[L+1]; ans+=(LL)L*(u1-u2+P)%P; if(ans>=P)ans-=P; } for(int i=n/m;i;i--) { ans+=(LL)phi[i]*(n/i)%P; if(ans>=P)ans-=P; } return ans;}int main (){ init(); int a,b; scanf("%d %d",&a,&b); a--; int A=solve(a); int B=solve(b); A=(LL)A*Iv[2]%P; A+=(LL)a*Iv[2]%P; if(A>=P)A-=P; B=(LL)B*Iv[2]%P; B+=(LL)b*Iv[2]%P; if(B>=P)B-=P; printf("%d\n",(B-A+P)%P); return 0;}
阅读全文
0 0
- 【51NOD 1227】平均最小公倍数
- 51Nod-1227-平均最小公倍数
- 51nod 1227 平均最小公倍数
- [杜教筛] 51Nod 1227 平均最小公倍数
- 51nod1227 平均最小公倍数
- 【51Nod1227】平均最小公倍数-杜教筛
- 51Nod--1012最小公倍数
- 51nod 最大公约数 & 最小公倍数
- 51nod 1419:最小公倍数挑战
- 51nod 1419 最小公倍数挑战
- 51 nod 1363 最小公倍数之和
- 51nod-1419 最小公倍数挑战
- 【51Nod 1363】最小公倍数之和
- 51nod 1012 最小公倍数LCM
- [51nod 1222]最小公倍数计数
- [51nod 1222]最小公倍数计数
- 51 NOD 1012 最小公倍数LCM
- 【51NOD 1222】最小公倍数计数
- 京东二面—Java 后台开发
- linux服务器下配置多个tomcat
- Linux 一些常用命令
- Linux安装fping和hping
- Spring 配置文件详解
- 51nod 1227 平均最小公倍数
- 简单的php环境搭建
- 序列化
- redis工具类
- think5 获取器的妙用
- Spring+SpringMVC+mybatis+redis(一)
- java简单实现RabbitMQ
- Spring+SpringMVC+mybatis+redis(二)
- go学习(九)——Go tool pprof之runtime/pprof 的使用