数学(数论)BZOJ 3309:DZY Loves Math
Description
对于正整数n,定义f(n)为n所含质因子的最大幂指数。例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0。
给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b)。
Input
第一行一个数T,表示询问数。
接下来T行,每行两个数a,b,表示一个询问。
Output
对于每一个询问,输出一行一个非负整数作为回答。
Sample Input
10000
7558588 9653114
6514903 4451211
7425644 1189442
6335198 4957
Sample Output
14225956593420
4332838845846
15400094813
HINT
【数据规模】
T<=10000
1<=a,b<=10^7
莫比乌斯反演得到:
(盗图)
然后有类似于yy的GCD的做法,分块加速,复杂度变O(√n)
问题就是如何快速预处理出后面的式子,设其为g(x),这时研究g函数性质,g(x)的取值有哪些规律呢?
将x分解质因数,x=p1a1*p2a2*p3a3*……*pnan,函数即是将x分解成两个集合,求值再求和。
1.假设a不全是同一个值,那么那个较小的素数,可以对每个情况属于两个集合使得其值互为相反数,所以值为0。
2.a值全相等时,易得g(x)=(-1)a-1,根据欧拉线性筛的性质,每个数被最小的素因子枚举到,可以维护两个值,当前的a值,去掉当前最小的素因子后的数。
然后就可以
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=;
int g[N],nxt[N],mem[N];
int prime[N],cnt;
bool check[N]; void Prepare(){
for(int i=;i<N;i++){
if(!check[i]){
prime[++cnt]=i;
g[i]=nxt[i]=mem[i]=;
}
for(int j=;j<=cnt;j++){
if(i*prime[j]>=N)break;
check[i*prime[j]]=true;
if(i%prime[j]==){
nxt[i*prime[j]]=nxt[i];
mem[i*prime[j]]=mem[i]+;
if(nxt[i]==)g[i*prime[j]]=;
else if(mem[nxt[i]]==mem[i]+)
g[i*prime[j]]=-g[nxt[i]];
else g[i*prime[j]]=;
break;
}
else{
nxt[i*prime[j]]=i;
mem[i*prime[j]]=;
g[i*prime[j]]=(mem[i]==)?-g[i]:;
}
}
}
for(int i=;i<N;i++)
g[i]+=g[i-];
}
int T,a,b;
long long ans;
int main(){
Prepare();
scanf("%d",&T);
while(T--){
scanf("%d%d",&a,&b);
if(a>b)swap(a,b);ans=;
for(int i=,p=;i<=a;i=p+){
p=min(a/(a/i),b/(b/i));
ans+=1ll*(g[p]-g[i-])*(a/i)*(b/i);
}
printf("%lld\n",ans);
}
return ;
}
维护了。
数学(数论)BZOJ 3309:DZY Loves Math的更多相关文章
- ●BZOJ 3309 DZY Loves Math
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3309 题解: 莫比乌斯反演,线筛 化一化式子: f(x)表示x的质因子分解中的最大幂指数 $ ...
- BZOJ 3309: DZY Loves Math
3309: DZY Loves Math Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 761 Solved: 401[Submit][Status ...
- bzoj 3309 DZY Loves Math 莫比乌斯反演
DZY Loves Math Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1303 Solved: 819[Submit][Status][Dis ...
- bzoj 3309 DZY Loves Math —— 莫比乌斯反演+数论分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 凭着上课所讲和与 Narh 讨论推出式子来: 竟然是第一次写数论分块!所以迷惑了半天: ...
- bzoj 3309 DZY Loves Math——反演+线性筛
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 像这种数据范围,一般是线性预处理,每个询问 sqrt (数论分块)做. 先反演一番.然 ...
- 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| ...
- BZOJ 3309 DZY Loves Math ——莫比乌斯反演
枚举$d=gcd(i,j)$ 然后大力反演 ——来自Popoqqq的博客. 然后大力讨论后面的函数的意义即可. http://blog.csdn.net/popoqqq/article/details ...
- BZOJ 3309: DZY Loves Math 莫比乌斯反演+打表
有一个神奇的技巧——打表 code: #include <bits/stdc++.h> #define N 10000007 #define ll long long #define se ...
- 【BZOJ】3309: DZY Loves Math 莫比乌斯反演优化
3309: DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007) ...
- 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 ...
随机推荐
- NSMutableParagraphStyle /NSParagraphStyle
// NSParagraphStyleAttributeName 段落的风格(设置首行,行间距,对齐方式什么的)看自己需要什么属性,写什么 NSMutableParagraphStyle *par ...
- C++ 数组的地址问题学习随笔
二维数组额地址问题学习,本文学习内容参考:http://blog.csdn.net/wwdlk/article/details/6322439 #include<iostream> usi ...
- bzoj1231: [Usaco2008 Nov]mixup2 混乱的奶牛
思路:状压dp,设f[i][j]表示当前已经选出的牛的状态为i,最后一头选出的牛为j的方案数. 然后注意就是初值不能是f[0][i]=1,因为所有牛本来都可以第一个被选中,然而这样一定初值有些牛可能就 ...
- Peter Pan By: J. M. Barrie
Audio book: (mp3+txt) http://www.booksshouldbefree.com/book/peter-pan-by-j-m-barrie
- v4l2简介
V4L是linux内核中关于视频设备的子系统,为linux下的视频驱动提供了统一的接口,使应用程序可以使用统一的API操作不同的视频设备,简化视频系统的开发与维护 V4L2相比与V4L有更好的扩展性和 ...
- git 备份和恢复
实际应用 设置之前要在个人用户设置中增加key(为了备份ssh的项目) 备份 进入ditlab容器 cd /home/git/gitlab bundle exec rake gitlab:backup ...
- 使用link在两个容器之间建立连接(mysql)
在使用Docker的时候我们会常常碰到这么一种应用,就是我需要两个或多个容器,其中某些容器需要使用另外一些容器提供的服务.比如这么一种情况:我们需要一个容器来提供mysql的数据库服务,而另外两个容器 ...
- phpredis
安装php的redis扩展: http://pecl.php.net/package/redis 也可以用PHP直接连redis: http://www.cnblogs.com/kudosharry/ ...
- ASP.NET 优化 check list
看到一个蛮有意思的网站,里面有针对asp.net方方面面优化的罗列: 点击打开链接http://webdevchecklist.com/asp.net/performance/ 点击打开链接http: ...
- 在Windows下不使用密码远程登陆Linux
在登陆Linux进行管理的时候我们通常会使用用户名和密码进行登陆,这样一来是比较麻烦,二来是不安全,为了解决这个问题,我们可以使用公私钥 (public keys和private keys)进行认证. ...