BZOJ3561 DZY Loves Math VI 莫比乌斯反演
看到\(gcd\)相关先推式子(默认\(N \leq M\)):
\(\begin{align*} \sum\limits_{i=1}^N \sum\limits_{j=1}^M (lcm(i,j))^{gcd(i,j)} & = \sum\limits_{d=1}^N d^d \sum\limits_{i=1}^\frac{N}{d} \sum\limits_{j=1}^\frac{M}{d} (ij)^{d} \sum\limits_{p \mid gcd(i,j)} \mu(p) \\ & = \sum\limits_{d=1}^N d^d \sum\limits_{p=1}^\frac{N}{d} \mu(p) p^{2d} \sum\limits_{i=1}^\frac{N}{dp} i^d \sum\limits_{j=1}^\frac{M}{dp} j^d \end{align*}\)
推到这里不需要套路地枚举\(T = dp\)了,到这里就开始做。
看到这道要筛东西的数论题的数据范围为\(500000\),这意味着这道题有极大可能用\(O(nlogn)\)算法。发现上面的式子中,先枚举\(d\)、然后枚举\(p\),总复杂度就是\(O(nlogn)\),所以我们需要均摊\(O(1)\)地得到后面的两个自然数幂次和。
其实可以发现,对于每一个\(d\),有效的\(i^d\)和\(j^d\)的个数为\(\frac{M}{d}\)个,也是一个调和级数。所以我们每一次把这些次幂和前缀和处理出来,复杂度仍然是对的。总复杂度\(O(nlogn)\)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
//This code is written by Itst
using namespace std;
const int MAXN = 5e5 + 7 , MOD = 1e9 + 7;
int N , M , cnt , num[MAXN] , sum[MAXN] , prime[MAXN] , mu[MAXN];
bool nprime[MAXN];
inline int poww(long long a , int b){
int times = 1;
while(b){
if(b & 1) times = times * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return times;
}
void init(){
mu[1] = 1;
for(int i = 2 ; i <= N ; ++i){
if(!nprime[i]){
prime[++cnt] = i;
mu[i] = -1;
}
for(int j = 1 ; prime[j] * i <= N && j <= cnt ; ++j){
nprime[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
mu[i * prime[j]] = -1 * mu[i];
}
}
}
int main(){
#ifndef ONLINE_JUDGE
//freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
init();
cin >> N >> M;
if(N > M) swap(N , M);
init();
for(int i = 1 ; i <= M ; ++i) num[i] = 1;
int all = 0;
for(int i = 1 ; i <= N ; ++i){
for(int j = 1 ; j <= M / i ; ++j){
num[j] = 1ll * num[j] * j % MOD;
sum[j] = (sum[j - 1] + num[j]) % MOD;
}
int cur = 0;
for(int j = 1 ; j <= N / i ; ++j)
cur = (cur + 1ll * mu[j] * num[j] * num[j] % MOD * sum[N / i / j] % MOD * sum[M / i / j] % MOD + MOD) % MOD;
all = (all + 1ll * poww(i , i) * cur) % MOD;
}
cout << all;
return 0;
}
BZOJ3561 DZY Loves Math VI 莫比乌斯反演的更多相关文章
- 【bzoj3561】DZY Loves Math VI 莫比乌斯反演
题目描述 给定正整数n,m.求 输入 一行两个整数n,m. 输出 一个整数,为答案模1000000007后的值. 样例输入 5 4 样例输出 424 题解 莫比乌斯反演 (为了方便,以下公式默认$ ...
- BZOJ 3561: DZY Loves Math VI 莫比乌斯反演+复杂度分析
推到了一个推不下去的形式,然后就不会了 ~ 看题解后傻了:我推的是对的,推不下去是因为不需要再推了. 复杂度看似很大,但其实是均摊 $O(n)$ 的,看来分析复杂度也是一个能力啊 ~ code: #i ...
- 【BZOJ3309】DZY Loves Math(莫比乌斯反演)
[BZOJ3309]DZY Loves Math(莫比乌斯反演) 题面 求 \[\sum_{i=1}^a\sum_{j=1}^bf(gcd(a,b))\] 其中,\(f(x)\)表示\(x\)分解质因 ...
- [BZOJ3561] DZY Loves Math VI
(14.10.28改) 本来只想写BZOJ3739:DZY Loves Math VIII的,不过因为和VI有关系,而且也没别人写过VI的题解,那么写下. 不过我还不会插公式…… http://www ...
- BZOJ3309 DZY Loves Math(莫比乌斯反演+线性筛)
一通正常的莫比乌斯反演后,我们只需要求出g(n)=Σf(d)*μ(n/d)的前缀和就好了. 考虑怎么求g(n).当然是打表啊.设n=∏piai,n/d=∏pibi .显然若存在bi>1则这个d没 ...
- DZY LOVES MATH (莫比乌斯反演)
OK!开始更新莫比乌斯反演 先看了一下数据范围,嗯,根据\(jiry\)老师的真言,我们一定是可以筛一遍然后用根号或者是\(log\)的算法. 题目思路挺简单,就是把原始的式子化成: \(\sum_{ ...
- BZOJ3561 DZY Loves Math VI 数论 快速幂 莫比乌斯反演
原文链接http://www.cnblogs.com/zhouzhendong/p/8116330.html UPD(2018-03-26):回来重新学数论啦.之前的博客版面放在更新之后的后面. 题目 ...
- BZOJ3561 DZY Loves Math VI 【莫比乌斯反演】
题目 给定正整数n,m.求 输入格式 一行两个整数n,m. 输出格式 一个整数,为答案模1000000007后的值. 输入样例 5 4 输出样例 424 提示 数据规模: 1<=n,m<= ...
- DZY Loves Math(莫比乌斯反演)
\(x=p_1^{\alpha_1}p_2^{\alpha_2}...p_c^{\alpha_c}\) \(f(x)=\max(\alpha_1,\alpha_2,...,\alpha_c)\) \( ...
随机推荐
- Python 文件复制&按目录树结构拷贝&批量删除目录及其子目录下的文件
文件复制&按目录树结构拷贝&批量删除目录及其子目录下的文件 by:授客 QQ:1033553122 测试环境: Python版本:Python 3.3.2 Win7 64 代码实践 # ...
- Okhttp3请求网络开启Gzip压缩
前沿 首先OkHttp3是支持Gzip解压缩的,不过我们要明白,它是支持我们在发起请求的时候自动加入header,Accept-Encoding: gzip,而我们的服务器返回的时候header中有C ...
- Wu反走样算法绘制直线段
Wu反走样算法 原理:在我看来,Wu反走样算法是在Bresenham算法基础上改进了一番,它给最靠近理想直线/曲线的两个点以不同的亮度值,以达到模糊锯齿的效果.因为人眼看到的是线附近亮度的平均值. M ...
- PQA组织的设置与运作
文/共创力咨询资深顾问 杨学明 PQA(Process Quality Assurance)是过程质量保证的意思,有的公司也把它称为PPQA(Product Process Quality Assu ...
- perfect-scrollbar在vue中的使用
1.下载perfect-scrollbar依赖包 npm install perfect-scrollbar 2.perfect-scrollbar特性 1)直接下载依赖包及包含css样式和js 2) ...
- Linux 自动化部署Rsyslog服务
Linux 自动化部署Rsyslog服务 源码如下: #/bin/bash #该脚本用于自动化部署Ryslog服务配置 #作者:雨中落叶 #博客:https://www.cnblogs.com/yuz ...
- SpringDataJpa的批量 保存 修改 操作
SpringDataJpa进行修改数据库操作有两种方式: 一.调用保存实体的方法 1.保存一个实体:repository.save(T entity) 2.保存多个实体:repository.save ...
- JAVA之Math类常用数学运算记录
Math中定义了许多的方法,且这些方法均为static类型,通过Math类就能直接调用. 调用形式:Math.方法名 例如,我要进行e运算,那么我直接调用Math.exp(double 类型 数值); ...
- python发展史
一:Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum)(龟叔).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹 打发时间,决心开发一个新的脚本解释程序, ...
- Teradata全面转型
大数据时代 Teradata全面转型 [关键点]:数据分析相关技术和方案==>帮助企业实现数据价值变现 1.所有企业达成共识 数据已经成为企业的资产,甚至是核心资产. 2.Teradata转型 ...