传送门

这个题观察一下之后发现,答案就是求

\[\sum_{i=1}^n\sum_{j=1}^mgcd(i,j) *2 - 1\]

那我们的目标就是求\(\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)\),先老套路转化成枚举gcd:

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

继续套路,把d除进去,然后因为莫比乌斯函数\(\sum_{d|n}\mu(d) = [n=1]\)的性质,我们转化式子

\[\sum_{d=1}^nd\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{m}{d}}\sum_{p|i,p|j}\mu(p)\]

把各项\(\sum\)之间的限制条件互相交换一下。之后发现,其实对于每一个枚举的p,i,j能取到的个数是一个可计算的定值,也就是式子可以变成如下情况:

\[\sum_{d=1}^nd\sum_{p=1}^{\frac{n}{d}}\mu(p)\left\lfloor\frac{n}{dp}\right\rfloor\left\lfloor\frac{m}{dp}\right\rfloor\]

这个式子乱七八糟的。有大佬在题解中说:看着这堆dp就很不爽。那我们用T来替代dp。

把T带入其实要做很多变化,比较显然的不说了,主要是两层\(\sum\)的嵌套改变比较让人难受。\(\sum_p^{\frac{n}{d}}\)变成\(\sum_{T=1}^n\)比较好理解,这个上下同乘d即可。至于\(\sum_{d=1}^n\)如何变成\(\sum_{d|T}\),这个我不是完全明白,大致的理解是,因为d必然是T的一个因子,所以其实这和d直接进行枚举基本是一样的,只是把原来的外层循环变到里面,里层循环变到外面。

那么式子就变成了:

\[\sum_{T=1}^n\sum_{d|T}d\mu(\frac{T}{d})\left\lfloor\frac{n}{T}\right\rfloor\left\lfloor\frac{m}{T}\right\rfloor\]

然后根据莫比乌斯反演,我们发现\(\sum_{d|T}d\mu(\frac{T}{d}) = \varphi(T)\)

所以我们最后要求的就是

\[\sum_{T=1}^n\varphi(T)\left\lfloor\frac{n}{T}\right\rfloor\left\lfloor\frac{m}{T}\right\rfloor\]

这个我们直接把欧拉函数筛出来求前缀和,用整除分块做一下就好了。

或者还有一种更简便的推导。

直接用欧拉函数的性质,我们对于每个gcd枚举他的因子,改为用这些因子的欧拉函数之和表示。

\[\sum_{i=1}^n\sum_{j=1}^m\sum_{d|i,d|j} \varphi(d)\]

还是把各项\(\sum\)之间的限制条件进行变换,直接可以得到

\[\sum_{d=1}^n\varphi(d)\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\right\rfloor\]

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<vector>
#include<map>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')
#define fr friend inline
#define y1 poj
#define mp make_pair
#define pr pair<int,int>
#define fi first
#define sc second
#define pb push_backusing namespace std;
typedef long long ll;
const int M = 200005;
const int INF = 1000000009;
const double eps = 1e-7;int read()
{int ans = 0,op = 1;char ch = getchar();while(ch < '0' || ch > '9') {if(ch == '-') op = -1;ch = getchar();}while(ch >= '0' && ch <= '9') ans = ans * 10 + ch - '0',ch = getchar();return ans * op;
}int a,b,c,d,k,p[M],mu[M],tot,n,phi[M],m;
ll sum[M];
bool np[M];void euler()
{np[1] = 1,phi[1] = 1;rep(i,2,M-2){if(!np[i]) p[++tot] = i,phi[i] = i-1;for(int j = 1;i * p[j] <= M-2;j++){np[i * p[j]] = 1;if(!(i % p[j])) {phi[i * p[j]] = phi[i] * p[j];break;}phi[i * p[j]] = phi[i] * (p[j] - 1);}}rep(i,1,M-2) sum[i] = sum[i-1] + phi[i];
}ll solve(ll a,ll b)
{ll lim = min(a,b),ans = 0;for(int i = 1,j;i <= lim;i = j + 1){j = min(a / (a / i),b / (b / i));ans += (ll)(a / i) * (ll)(b / i) * (sum[j] - sum[i-1]);}return ans * 2 - a * b;
}int main()
{euler();n = read(),m = read();printf("%lld\n",solve(n,m));return 0;
}

转载于:https://www.cnblogs.com/captain1/p/10122325.html

NOI2010 能量采集相关推荐

  1. [NOI2010]能量采集

    469. [NOI2010]能量采集 ★★☆   输入文件:energy2010.in   输出文件:energy2010.out   简单对比 时间限制:1 s   内存限制:512 MB [问题描 ...

  2. (每日一题)P1447 [NOI2010] 能量采集(莫反套路 + 欧拉反演 / 容斥原理)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.19 莫反 Problem Solu ...

  3. P1447 [NOI2010]能量采集(mobius反演)

    P1447 [NOI2010]能量采集 式子化简 显然题目就是要我们求∑i=1n∑j=1m2gcd(i,j)−1\sum_{i = 1} ^{n} \sum_{j = 1} ^{m} 2gcd(i, ...

  4. P1447 [NOI2010] 能量采集

    P1447 [NOI2010] 能量采集 题意: 如果一棵植物与能量汇集机器(坐标为0,0)连接而成的线段上有 k 棵植物,则能量的损失为 2k + 1 给你一个n*m的植物园,问能量损失是多少 1& ...

  5. BZOJ 2005: [Noi2010]能量采集( 数论 + 容斥原理 )

    一个点(x, y)的能量损失为 (gcd(x, y) - 1) * 2 + 1 = gcd(x, y) *  2 - 1. 设g(i)为 gcd(x, y) = i ( 1 <= x <= ...

  6. bz2005 2005: [Noi2010]能量采集 数学题

    2005: [Noi2010]能量采集 Time Limit: 10 Sec  Memory Limit: 552 MB Submit: 2494  Solved: 1475 [Submit][Sta ...

  7. bzoj2005: [Noi2010]能量采集

    不知道什么算法. 首先求一颗植物(i,j)与能量采集器的连线上有几颗植物. 答案是(gcd(i,j)-1),设i'= i/gcd(i,j),j'=j/gcd(i,j). 则这几颗植物是(i'k,j'k ...

  8. [2019.1.14]BZOJ2005 [Noi2010]能量采集

    以下设\(n\ge m\). 首先,一个点\((x,y)\)到\((0,0)\)的路径上经过的点的数量(不包括首尾)为\(gcd(x,y)-1\). 所以它的能量损耗为\(2\times gcd(x, ...

  9. BZOJ2005: [Noi2010]能量采集 莫比乌斯反演的另一种方法——nlogn筛

    分析:http://www.cnblogs.com/huhuuu/archive/2011/11/25/2263803.html 注:从这个题收获了两点 1,第一象限(x,y)到(0,0)的线段上整点 ...

  10. BZOJ2005 NOI2010 能量采集 欧拉函数

    题意:求$\sum\limits_{i = 1}^N {\sum\limits_{j = 1}^M {f(i,j)} } $,其中f(i,j)=(0,0)与(i,j)连线上点的数量 题解: 如果一个点 ...

最新文章

  1. anaconda卸载重装matplotlib
  2. Vmware workstation 网络连接类型
  3. 全球及中国散热市场投资需求与运营格局现状分析报告2022年
  4. java怎么安装_Windows、Linux、Mac下安装JDK
  5. Java继承_30道最常问的Java基础面试题
  6. Flutter基础(十三)Flutter与Android的相互通信
  7. 未检测到与wia兼容的设备_关于检测到不兼容硬件设备的解决办法
  8. RestClient的简单介绍
  9. leaflet 加载百度离线瓦片
  10. AI大神各显神通!百度深度学习集训营作品大赏
  11. ldap根据dn值查找objectClass
  12. #64-【模拟】屠城(zly#3)
  13. 宇宙演化的终极意义是什么?
  14. SWT定位– setBounds()或setLocation()
  15. UE4 材质学习 (01-第一个材质)
  16. 模拟电路实验 03 - | 负反馈放大电路
  17. JS实现随机抽奖功能
  18. 服务器在新加坡延迟,从国内访问新加坡服务器延迟多大?
  19. SMART Modular世迈科技推出首款XMM CXL内存模块
  20. 以太坊MPT数据结构

热门文章

  1. leadtools ocr java_LEADTOOLS OCR文字识别教程:处理识别结果
  2. ubuntu使用deepin-wine和wine运行windows系统(安装qq,weixin等解决方案)
  3. Apache ServiceComb 社区4月动态精选
  4. VMware安装Win10
  5. 安装Microsoft office遇到的不支持从预发版Microsoft Office 2010问题
  6. 计算机无法冷关机,笔记本关不了机怎么回事?笔记本电脑无法关机解决方案
  7. 信息熵、信息增益与信息增益率
  8. 10个让人心情变好的颜色【附RGB值以及html值】
  9. 1亿以内素数的个数_1亿以内的回文质数
  10. 【电影漫谈】谈谈我心目中的香港武术指导