居然扒到了学长出的题

和3944差不多(?),虽然一眼看上去很可怕但是仔细观察发现,对于mu来讲,答案永远是1(对于带平方的,mu值为0,1除外),然后根据欧拉筛的原理,\( \sum_{i=1}{n}\phi(i2)=\sum_{i=1}^{n}\phi(i)*i \),然后就可以正常推了:

\[g(n)=\sum_{i=1}^{n}i\sum_{d=1}^{i}[d|i]\phi(d)=\sum_{i=1}^{n}i^2=\frac{n(n+1)(2n+1)}{6}
\]

\[s(n)=\sum_{i=1}^{n}i\phi(i)
$$那么把g展开:
\]

g(n)=\sum_{i=2}{n}i\sum_{d=1}{i-1}[d|i]\phi(d)+s(n)

\[\]

s(n)=g(n)-\sum_{i=2}{n}i\sum_{d=1}{i-1}[d|i]\phi(d)

\[\]

=g(n)-\sum_{k=2}{n}k\sum_{d=1}{\left \lfloor \frac{n}{k} \right \rfloor}d\phi(d)

\[\]

=g(n)-\sum_{k=2}^{n}k*s(\left \lfloor \frac{n}{k} \right \rfloor)

\[\]

=\frac{n(n+1)(2n+1)}{6}-\sum_{k=2}^{n}k*s(\left \lfloor \frac{n}{k} \right \rfloor)

\[这就是标准的杜教筛递归子问题形式了,直接求解即可。
```cpp
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;
const int N=1000005,m=1000000,mod=1e9+7;
int phi[N],mi[N],q[N],tot,n,k,s[N],ans[N];
bool v[N];
map<long long,int>mp;
int S(int n,int l)
{
if(l<=1)
return phi[n*l];
if(n==1)
{
if(l<=m)
return s[l];
if(ans[k/l]!=-1)
return ans[k/l];
long long re=(long long)l*(l+1)/2%mod;
for(int i=2,la;i<=l;i=la+1)
{
la=l/(l/i);
if(l/i<=m)
re=(re-(long long)s[l/i]*(la-i+1)%mod)%mod;
else
re=(re-(long long)S(1,l/i)*(la-i+1)%mod)%mod;
}
return ans[k/l]=(re%mod+mod)%mod;
}
if(mp[(long long)n*mod+l])
return mp[(long long)n*mod+l];
long long re=0ll;
for(int i=1;i*i<=n;i++)
if(n%i==0)
{
re=(re+(long long)phi[n/i]*S(i,l/i)%mod)%mod;
if(i*i!=n)
re=re+(long long)phi[i]*S(n/i,l/(n/i))%mod;
}
return mp[(long long)n*mod+l]=(re%mod+mod)%mod;
}
// int S(int n,int l)
// {
// if (l<=1) return phi[n*l];
// if (n==1)
// {
// if (l<=m) return s[l];
// if (ans[k/l]!=-1) return ans[k/l];
// int re=(int)l*(l+1)/2%mod;
// for (int i=2,la;i<=l;i=la+1)
// {
// la=l/(l/i);
// if (l/i<=m) re=re-(int)(la-i+1)*s[l/i]%mod+mod;
// else re=re-(int)(la-i+1)*S(1,l/i)%mod+mod;
// }
// return ans[k/l]=re%mod;
// }
// else
// {
// if (mp[(int)n*mod+l]) return mp[(int)n*mod+l];
// int re=0;
// for (int i=1;i*i<=n;i++)
// if (n%i==0)
// {
// re=re+(int)phi[n/i]*S(i,l/i)%mod;
// if (i*i!=n) re=re+(int)phi[i]*S(n/i,l/(n/i))%mod;
// }
// return mp[(int)n*mod+l]=re%mod;
// }
// }
int main()
{
memset(ans,-1,sizeof(ans));
mi[1]=phi[1]=1;
for(int i=2;i<=m;i++)
{
if(!v[i])
{
q[++tot]=i;
phi[i]=i-1;
mi[i]=i;
}
for(int j=1;j<=tot&&i*q[j]<=m;j++)
{
int k=i*q[j];
v[k]=1;
if(i%q[j]==0)
{
phi[k]=phi[i]*q[j];
mi[k]=mi[i];
break;
}
phi[k]=phi[i]*(q[j]-1);
mi[k]=mi[i]*q[j];
}
}
for(int i=1;i<=m;i++)
s[i]=(s[i-1]+phi[i])%mod;
scanf("%lld%lld",&n,&k);
if(n>k)
swap(n,k);
long long ans=0ll;
for(int i=1;i<=n;i++)
ans=(ans+((long long)i/mi[i]*S(mi[i],k)%mod))%mod;
printf("%lld\n",(ans%mod+mod)%mod);
return 0;
}
```\]

bzoj 4916: 神犇和蒟蒻【欧拉函数+莫比乌斯函数+杜教筛】的更多相关文章

  1. [BZOJ 4916]神犇和蒟蒻

    Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你 ...

  2. 【刷题】BZOJ 4916 神犇和蒟蒻

    Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你 ...

  3. bzoj 4916: 神犇和蒟蒻 (杜教筛+莫比乌斯反演)

    题目大意: 读入n. 第一行输出“1”(不带引号). 第二行输出$\sum_{i=1}^n i\phi(i)$. 题解: 所以说那个$\sum\mu$是在开玩笑么=.= 设$f(n)=n\phi(n) ...

  4. 51nod 1237 最大公约数之和 V3【欧拉函数||莫比乌斯反演+杜教筛】

    用mu写lcm那道卡常卡成狗(然而最后也没卡过去,于是写一下gcd冷静一下 首先推一下式子 \[ \sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j) \] \[ \sum_{i= ...

  5. LG4213 【模板】杜教筛(Sum)和 BZOJ4916 神犇和蒟蒻

    P4213 [模板]杜教筛(Sum) 题目描述 给定一个正整数$N(N\le2^{31}-1)$ 求 $$ans_1=\sum_{i=1}^n\varphi(i)$$ $$ans_2=\sum_{i= ...

  6. 【BZOJ4916】神犇和蒟蒻(杜教筛)

    [BZOJ4916]神犇和蒟蒻(杜教筛) 题面 BZOJ 求 \[\sum_{i=1}^n\mu(i^2)\ \ 和\ \sum_{i=1}^n\phi(i^2)\] 其中\[n<=10^9\] ...

  7. 【BZOJ4916】神犇和蒟蒻 解题报告

    [BZOJ4916]神犇和蒟蒻 Description 很久很久以前,有一群神犇叫sk和ypl和ssr和hjh和hgr和gjs和yay和xj和zwl和dcx和lyy和dtz和hy和xfz和myh和yw ...

  8. 【BZOJ4805】欧拉函数求和(杜教筛)

    [BZOJ4805]欧拉函数求和(杜教筛) 题面 BZOJ 题解 好久没写过了 正好看见了顺手切一下 令\[S(n)=\sum_{i=1}^n\varphi(i)\] 设存在的某个积性函数\(g(x) ...

  9. [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)

    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...

随机推荐

  1. 检查nginx配置,重载配置以及重启的方法

    原文  http://blogread.cn/it/article/4549?f=hot1 几个常用的nginx命令 Nginx 安装后只有一个程序文件,本身并不提供各种管理程序,它是使用参数和系统信 ...

  2. linux文件描述符fd(windows下的句柄)

    在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件 fd:file descriptor 文件描述符0,1,2分别给了标准输入.标准输出和错误输出. ls - ...

  3. Intellij IDEA远程调试tomcat

    1.windows系统 文件catalina.bat首行增加下面代码 set CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE ...

  4. 一起talk C栗子吧(第九十六回:C语言实例--使用共享内存进行进程间通信二)

    各位看官们.大家好,上一回中咱们说的是使用共享内存进行进程间通信的样例,这一回咱们接着上一回内容继续说使用共享内存进行进程间通信. 闲话休提,言归正转.让我们一起talk C栗子吧! 我们在上一回中介 ...

  5. C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法

    C#构造方法(函数)   一.概括 1.通常创建一个对象的方法如图: 通过  Student tom = new Student(); 创建tom对象,这种创建实例的形式被称为构造方法. 简述:用来初 ...

  6. Android NDK 环境搭建

    使用最新ndk,直接抛弃cygwin,曾经做Android的项目要用到NDK就必需要下载NDK,下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配 ...

  7. NOI 2015 滞后赛解题报告

    报同步赛的时候出了些意外.于是仅仅能做一做"滞后赛"了2333 DAY1 T1离线+离散化搞,对于相等的部分直接并查集,不等部分查看是否在同一并查集中就可以,code: #incl ...

  8. windows内存管理的机制以及优缺点

    分页存储管理基本思想:用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等.可将用户程序的任一页放在内存的任一块中,实现了离散分配. 分段存储管 ...

  9. hdu2099 整除的位数(暴力)

    Problem Description http://acm.hdu.edu.cn/showproblem.php?pid=2099 一个整数,仅仅知道前几位.不知道末二位,被还有一个整数除尽了,那么 ...

  10. PyTorch 60 分钟入门教程

    PyTorch 60 分钟入门教程:PyTorch 深度学习官方入门中文教程 http://pytorchchina.com/2018/06/25/what-is-pytorch/ PyTorch 6 ...