以后这种题能用phi的就不要用mu…mu往往会带着个ln然后被卡常致死

把题目要求转换为前缀和相减的形式,写出来大概是要求这样一个式子:

\[\sum_{i=1}^{n}\sum_{j=1}^{i}\frac{j}{gcd(i,d)}
\]

注意j的限制是i

\[\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{i}[gcd(i,j)==d]\frac{j}{d}
\]

\[\sum_{d=1}^{n}\sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum_{j=1}^{i}[gcd(i,j)==1]\frac{jd}{d}
\]

\[\sum_{d=1}^{n}\sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum_{j=1}^{i}[gcd(i,j)==1]j
\]

然后有一个打表找规律发现的式子:

\[\sum_{i=1}^{n}\sum_{j=1}^{i}[gcd(i,j)==1]i*j=\sum_{i=1}^{n}i*\frac{\phi(i)*i+[i==1]}{2}
\]

于是原式可转化为:

\[\sum_{d=1}^{n}\sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\frac{\phi(i)*i+[i==1]}{2}
\]

\[\frac{\sum_{d=1}^{n}\sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\phi(i)*i}{2}+\frac{n}{2}
\]

先不考虑后面的加和下面的除二,于是要求的就是:

\[\sum_{d=1}^{n}\sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\phi(i)*i
\]

\( \sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\phi(i)*i \)的部分显然可以用杜教筛处理,然后拒绝算时间复杂度。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const long long N=1000005,m=1000000,inv6=166666668,inv2=500000004,mod=1e9+7;
long long a,b,n,phi[N],q[N],tot,ha[N];
bool v[N];
long long clc1(long long x)
{
return x*(x+1)%mod*inv2%mod;
}
long long clc2(long long x)
{
return x*(x+1)%mod*(2*x+1)%mod*inv6%mod;
}
long long slv(long long x)
{
if(x<=m)
return phi[x];
if(ha[n/x])
return ha[n/x];
long long re=clc2(x);
for(long long i=2,la;i<=x;i=la+1)
{
la=x/(x/i);
re=(re-(clc1(la)-clc1(i-1))%mod*slv(x/i)%mod)%mod;
}
return ha[n/x]=re;
}
long long wk(long long x)
{
n=x;
memset(ha,0,sizeof(ha));
long long re=0ll;
for(long long i=1,la;i<=x;i=la+1)
{
la=x/(x/i);
re=(re+(la-i+1)*slv(x/i)%mod)%mod;
}
return (re+x)*inv2%mod;
}
int main()
{
phi[1]=1;
for(long long i=2;i<=m;i++)
{
if(!v[i])
{
q[++tot]=i;
phi[i]=i-1;
}
for(long long j=1;j<=tot&&i*q[j]<=m;j++)
{
long long k=i*q[j];
v[k]=1;
if(i%q[j]==0)
{
phi[k]=phi[i]*q[j];
break;
}
phi[k]=phi[i]*(q[j]-1);
}
}
for(long long i=1;i<=m;i++)
phi[i]=(phi[i-1]+phi[i]*i%mod)%mod;
scanf("%lld%lld",&a,&b);
printf("%lld\n",((wk(b)-wk(a-1))%mod+mod)%mod);
return 0;
}

51nod 1227 平均最小公倍数【欧拉函数+杜教筛】的更多相关文章

  1. 51nod 1238 最小公倍数之和 V3 【欧拉函数+杜教筛】

    首先题目中给出的代码打错了,少了个等于号,应该是 G=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) { G = (G + lcm(i,j)) % 10000 ...

  2. BZOJ4916 神犇和蒟蒻(欧拉函数+杜教筛)

    第一问是来搞笑的.由欧拉函数的计算公式容易发现φ(i2)=iφ(i).那么可以发现φ(n2)*id(n)(此处为卷积)=Σd*φ(d)*(n/d)=nΣφ(d)=n2 .这样就有了杜教筛所要求的容易算 ...

  3. bzoj 3944: Sum【莫比乌斯函数+欧拉函数+杜教筛】

    一道杜教筛的板子题. 两个都是积性函数,所以做法是一样的.以mu为例,设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1} ...

  4. BZOJ4916 神犇和蒟蒻 【欧拉函数 + 杜教筛】

    题目 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; 输入格式 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; 输出格式 请你输出一个整数A=\sum ...

  5. 51nod 1239 欧拉函数之和【欧拉函数+杜教筛】

    和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\phi(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\phi(i) ...

  6. 【luogu3768】简单的数学题 欧拉函数(欧拉反演)+杜教筛

    题目描述 给出 $n$ 和 $p$ ,求 $(\sum\limits_{i=1}^n\sum\limits_{j=1}^nij\gcd(i,j))\mod p$ . $n\le 10^{10}$ . ...

  7. [51nod1227]平均最小公倍数(莫比乌斯反演+杜教筛)

    题意 求 $\sum_{i=a}^b \sum_{j=1}^i \frac{lcm(i,j)}{i}$. 分析 只需要求出前缀和, $$\begin{aligned}\sum_{i=1}^n \sum ...

  8. 51NOD 1227 平均最小公倍数 [杜教筛]

    1227 平均最小公倍数 题意:求\(\frac{1}{n} \sum_{i=1}^n lcm(n,i)\) 和的弱化版? \[ ans = \frac{1}{2}((\sum_{i=1}^n \su ...

  9. bzoj 4916: 神犇和蒟蒻【欧拉函数+莫比乌斯函数+杜教筛】

    居然扒到了学长出的题 和3944差不多(?),虽然一眼看上去很可怕但是仔细观察发现,对于mu来讲,答案永远是1(对于带平方的,mu值为0,1除外),然后根据欧拉筛的原理,\( \sum_{i=1}^{ ...

随机推荐

  1. mybatisplus代码生成器

    一.随便建一个springboot工程,在pom文件中导入依赖 <!-- 模板引擎 --> <dependency> <groupId>org.apache.vel ...

  2. 七天从零基础学习android(2)--第一个安卓程序

    在环境配置的那一部分,已经把基础的环境配置好了,接下来应该实现第一个安卓程序,就是著名的hello world 先在avd里面新建一个虚拟机,并且启动它 然后该虚拟机器能够在eclipse上正常识别 ...

  3. linux signal 列表

    Linux 信号表   Linux支持POSIX标准信号和实时信号.下面给出Linux Signal的简表,详细细节可以查看man 7 signal. 默认动作的含义如下: Term    终止进程 ...

  4. vue2.0单元测试(一)

    1.在vue init webpack XXX创建项目的时候 最后2步选择YES就启动了vue单元测试开始了   2.测试是使用karma+mocha框架来实现的方法,安装虚拟浏览器模块Phantom ...

  5. Spring MVC异常处理实例

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/mvc-framework/spring-exception-handling-example.ht ...

  6. 多平台密码绕过及提权工具Kon-Boot的使用与防范

    在单用户的机器上密码可能没那么重要,但是一旦有多个用户可以使用这台机器,密码就显得十分必要了(比如有儿童账户的电脑).所以说为你的电脑增设一条防线的最常用,最简单的方法就是用密码将你的电脑保护起来,但 ...

  7. Hadoop在window上运行 user=Administrator, access=WRITE, inode="hadoop"

    win7下eclipse中错误的详细描述如下: org.apache.hadoop.security.AccessControlException: org.apache.hadoop.securit ...

  8. 常用近百个js代码汇总

    //檢查空串 function isEmpty(str){ )) return (true); else return(false); } //檢查是否未數字 function isDigit(the ...

  9. 硬件开发之pcb---PCB抗干扰设计原则

    一 电源线布置: 1.电源线.地线的走向应与资料的传递方向一致. 二 地线布置: 1.数字地与模拟地分开. 2.接地线应尽量加粗,致少能通过3倍于印制板上的允许电流,一般应达2~3mm. 3.接地线应 ...

  10. JAVA 并发编程-返回运行结果(Callable和Future)(九)

    启动一个线程不论使用Thread或者Runnable的时候.都是没有返回结果的. 也就是说Thread和Runnable的run()方法必须没有返回值. public void run(){} 解决方 ...