3512: DZY Loves Math IV

题意:求\(\sum_{i=1}^n \sum_{j=1}^m \varphi(ij)\),\(n \le 10^5, m \le 10^9\)


n较小,考虑写成前缀和的形式,计算\(S(n,m)=\sum_{i=1}^m \varphi(in)\)


一开始想出

\[n= \prod_i p_i,\ \varphi(in) = \varphi(i) \cdot \varphi(\frac{n}{d})\cdot d,\ d=(n,i)
\]

比较好想,共有的质因子应该乘\(p\)而不是\(p-1\)

然后带进去枚举gcd用莫比乌斯反演的套路,中间的函数很奇怪不好算前缀和...


orz了题解,发现题解使用\(\varphi * 1 =id\)来替换

\[\varphi(in) = \varphi(i) \cdot \varphi(\frac{n}{d})\cdot \sum_{e\mid d} \varphi(e) = \varphi(i) \cdot \sum_{e\mid d}\varphi(\frac{n}{e})
\]

因为n是不同质因子的乘积,所以可以把两个\(\varphi\)乘起来

这一步替换和用\(\mu * 1 = \epsilon\)替换有异曲同工之妙,都是将\(gcd\)等于的限制弱化了,变成了整除的关系

推倒后得到

\[S(n,m) = \sum_{d\mid n}\varphi(\frac{n}{d})\cdot S(d, \lfloor \frac{m}{d} \rfloor)
\]

对于n不是不同质因子的乘积的,根据\(\varphi\)的公式,多的质因子次数直接提出来乘上就行了

然后记忆化搜索,\(n=1\)就是\(\varphi\)的前缀和

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
typedef long long ll;
const int N=1664512, U=1664510, mo = 1e9+7;
inline int read(){
char c=getchar(); int x=0,f=1;
while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
return x*f;
} int n, m;
inline void mod(int &x) {if(x>=mo) x-=mo; else if(x<0) x+=mo;}
bool notp[N]; int p[N/10], phi[N], pr[N];
void sieve(int n) {
phi[1]=1; pr[1] = 1;
for(int i=2; i<=n; i++) {
if(!notp[i]) p[++p[0]] = i, phi[i] = i-1, pr[i] = i;
for(int j=1; j <= p[0] && i*p[j] <= n; j++) {
int t = i*p[j];
notp[ t ] = 1;
if(i % p[j] == 0) {
phi[t] = phi[i] * p[j];
pr[t] = pr[i];
break;
}
phi[t] = phi[i] * (p[j] - 1);
pr[t] = pr[i] * p[j];
}
mod(phi[i] += phi[i-1]);
}
} namespace ha {
const int p = 1001001;
struct meow{int ne, val, r;} e[3000];
int cnt=1, h[p];
inline void insert(int x, int val) {
int u = x % p;
for(int i=h[u];i;i=e[i].ne) if(e[i].r == x) return;
e[++cnt] = (meow){h[u], val, x}; h[u] = cnt;
}
inline int quer(int x) {
int u = x % p;
for(int i=h[u];i;i=e[i].ne) if(e[i].r == x) return e[i].val;
return -1;
}
} using ha::insert; using ha::quer; int dj_s(int n) {
if(n <= U) return phi[n];
if(quer(n) != -1) return quer(n);
int ans = (ll) n * (n+1) / 2 %mo, r;
for(int i=2; i<=n; i=r+1) {
r = n/(n/i);
mod(ans -= (ll) dj_s(n/i) * (r-i+1) %mo);
}
insert(n, ans);
return ans;
} inline int Pow(int a, int b) {
int ans=1;
for(; b; b>>=1, a=a*a)
if(b&1) ans=ans*a;
return ans;
}
inline ll Phi(int n) {
int ans = 1;
if(n <= U) {mod(ans = phi[n] - phi[n-1]); return ans;}
int m = sqrt(n);
for(int i=1; p[i] <= m; i++) if(n % p[i] == 0) {
int a = 0;
while(n % p[i] == 0) a++, n /= p[i];
ans *= Pow(p[i], a-1) * (p[i] - 1);
}
return ans;
} map<int, int> Map[N];
int S(int n, int m) {
if(m == 0) return 0;
if(n == 1) return dj_s(m);
if(Map[n][m]) return Map[n][m];
//printf("S %d %d\n", n, m);
int ans = 0;
for(int i=1; i*i <= n; i++) if(n%i == 0) {
int j = n/i;
mod(ans += Phi(j) * S(i, m/i) %mo);
if(i != j) mod(ans += Phi(i) * S(j, m/j) %mo);
}
Map[n][m]=ans;
return ans;
}
int main() {
freopen("in", "r", stdin);
sieve(U);
n=read(); m=read();
int ans = 0;
for(int i=1; i<=n; i++) mod(ans += (ll) i / pr[i] * S(pr[i], m) %mo);
//for(int i=1; i<=n; i++) printf("nnnnnnnn %d %d\n", i, S(i, m));
printf("%d\n", ans);
}

BZOJ 3512: DZY Loves Math IV [杜教筛]的更多相关文章

  1. 【bzoj3512】DZY Loves Math IV 杜教筛+记忆化搜索+欧拉函数

    Description 给定n,m,求\(\sum_{i=1}^{n}\sum_{j=1}^{m}\varphi(ij)\)模10^9+7的值. Input 仅一行,两个整数n,m. Output 仅 ...

  2. bzoj 3512: DZY Loves Math IV【欧拉函数+莫比乌斯函数+杜教筛】

    参考:http://blog.csdn.net/wzf_2000/article/details/54630931 有这样一个显然的结论:当\( |\mu(n)|==1 \)时,\( \phi(nk) ...

  3. ●BZOJ 3512 DZY Loves Math IV

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3512 题解: $$求ANS=\sum_{i=1}^{N}\sum_{j=1}^{M}\phi ...

  4. 【刷题】BZOJ 3512 DZY Loves Math IV

    Description 给定n,m,求 模10^9+7的值. Input 仅一行,两个整数n,m. Output 仅一行答案. Sample Input 100000 1000000000 Sampl ...

  5. bzoj 3512: DZY Loves Math IV

    Description 给定n,m,求 模10^9+7的值. Solution 设 \(S(n,m)\) 表示 \(\sum_{i=1}^{m}\phi(n*i)\) \(Ans=\sum_{i=1} ...

  6. BZOJ 3309: DZY Loves Math [莫比乌斯反演 线性筛]

    题意:\(f(n)\)为n的质因子分解中的最大幂指数,求\(\sum_{i=1}^n \sum_{j=1}^m f(gcd(i,j))\) 套路推♂倒 \[ \sum_{D=1}^n \sum_{d| ...

  7. ●BZOJ 3309 DZY Loves Math

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3309 题解: 莫比乌斯反演,线筛 化一化式子: f(x)表示x的质因子分解中的最大幂指数 $ ...

  8. 【BZOJ3512】DZY Loves Math IV(杜教筛)

    [BZOJ3512]DZY Loves Math IV(杜教筛) 题面 BZOJ 求 \[\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\] 其中\(n\le 10^5,m\l ...

  9. BZOJ 3561 DZY Loves Math VI

    BZOJ 3561 DZY Loves Math VI 求\(\sum_{i=1}^{n}\sum_{j=1}^{m}\text{lcm}(i,j)^{\gcd(i,j)}\),钦定\(n\leq m ...

随机推荐

  1. Open-air shopping malls(二分半径,两元交面积)

    http://acm.hdu.edu.cn/showproblem.php?pid=3264 Open-air shopping malls Time Limit: 2000/1000 MS (Jav ...

  2. 访问 Tomcat支配项目去除项目名和端口号通过IP地址(或域名)访问

    Tomcat去除项目名称和端口号 1. 去除端口号 将端口设为80: <Connector port="80" protocol="HTTP/1.1" c ...

  3. linux下python2升级python3,python2和python3并存

    wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz 解压:tar -xzvf Python-3.6.4.tgz cd Pytho ...

  4. [国嵌攻略][152][I2C总线介绍]

    IIC电气特性 I2C(inter intergrated circuit)总线是由philps公司开发的两线式串行总线,用于连接微控制器及其外围设备. I2C总线只有两根双向信号线: SDA:ser ...

  5. 使用gitbook 发布一个教程文档网站

    gitbook是一个好用的发布电子书的项目:使用gitbook 可以在本地写好文档再远程推送到库:也可以在gitbook提供的在线平台上制作电子书:要想在自己的服务器上使用gitbook 发布一个网站 ...

  6. 程序员是这样区分Null和Undefined

    Null类型 Null类型是第二个只有一个值的数据类型,这个特殊的值是null.从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值时会返回"obje ...

  7. XGBoost、LightGBM的详细对比介绍

    sklearn集成方法 集成方法的目的是结合一些基于某些算法训练得到的基学习器来改进其泛化能力和鲁棒性(相对单个的基学习器而言)主流的两种做法分别是: bagging 基本思想 独立的训练一些基学习器 ...

  8. Thrift compiler代码生成类解析

    代码生成类解析: Thrift--facebook RPC框架,介绍就不说了,百度,google一大把,使用也不介绍,直接上结构和分析吧. Hello.thrift文件内容如下: namespace ...

  9. MYSQL ORDER BY Optimization

    ORDER BY Optimization 某些情况下,MYSQL可以使用index排序而避免额外的sorting. 即使order by语句列不能准确的匹配index,只要没有index中(不在or ...

  10. linux tpm 测试完整记录,亲测有效。

    没有tpm芯片,采用模拟器的方式来测试. 实验环境:内核版本 3.10.0-327 软件包准备: 内网,没有仓库,自己网上下载: 1. cmake-3.9.6-Linux-x86_64.tar.gz ...