对于正整数n,定义f(n)为n所含质因子的最大幂指数。例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0。
给定正整数a,b,求:

$$\sum_{i=1}^{i<=a}\sum_{j=1}^{j<=b}f(gcd(i,j))$$

bzojP3309

http://www.lydsy.com/JudgeOnline/problem.php?id=3309



化式子:

$$\sum_{i=1}^{i<=a}\sum_{j=1}^{j<=b}f(gcd(i,j))$$

$$\sum_{x=1}^{min(a,b)}f(x)·\sum_{x|d}\mu({d \over x})({a \over d})({b \over d})$$

$$\sum_{x=1}^{min(a,b)}f(x)·\sum_{d=1}^{min(a,b) \over x}\mu(d)({a \over dx})({b \over dx})$$

$$\sum_{dx=1}^{min(a,b)}({a \over dx})({b \over dx})\sum_{d=1}^{d<=dx}f(x)*\mu(d)$$

$$\sum_{x=1}^{min(a,b)}({a \over x})({b \over x})(f*\mu)(x)$$

这个化式子的过程旨在尽可能地把无关a,b的,可预处理的部分提出来;

现在只要预处理出f与$\mu$的卷积即可通过枚举除法做到单次$O(\sqrt{n})的效率$

f和$\mu$可以通过线性筛求出,

如何在较好的时间内求出他们的卷积呢;

不会,

不过打表可以发现:

$$当\mu(i)=1时,(f*\mu)(i)=-1$$

$$当\mu(i)=-1时,(f*\mu)(i)=1$$

$$当\mu(i)=0时,若i的所有质因子齐次,次数为k,则(f*\mu)(i)=(f*\mu)(^{k}\sqrt{i}),否则(f*\mu)(i)=0$$

这样处理好$f*\mu$,然后枚举除法即可;

由于笔者太弱,于是直接上了单次处理$O(log_2log_2n)$的线性筛

2018.01.25 upd:我原来以为暴力计算卷积函数是$O(n\sqrt{n})$的,后来才发现,这其实是$O(n*ln(n))$的,所以暴力计算f*mu应该也能过

2018.01.25 upd:一开始不觉得数列求和分析复杂度可以积分(好像在项数少的时候不太拟合),现在看来好像可以(项数多的时候比较好)

2018.07.12 upd:这里顺便记录一下枚举除法套枚举除法是$O(N^{3\over 4})$的,积分证得

代码:

 #include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int MAXN=1e7;
LL f_mu[MAXN+];
int pri[MAXN],f[MAXN+],mu[MAXN+],p[MAXN+],cnt;
bool vis[MAXN];
LL sum[MAXN+];
void prime();
LL Sqr(LL ,int );
LL work(int ,int );
int main()
{
int i,j,k,n,a,b;
prime();
sum[]=f_mu[]=sum[]=;
for(i=;i<=MAXN;i++){
if(mu[i]==)
f_mu[i]=-;
if(mu[i]==-)
f_mu[i]=;
if(mu[i]==){
if(i==Sqr(p[i],f[i]))
f_mu[i]=f_mu[p[i]];
else
f_mu[i]=;
}
sum[i]=sum[i-]+f_mu[i];
}
scanf("%d",&n);
for(i=;i<=n;i++){
scanf("%d%d",&a,&b);
printf("%lld\n",work(a,b));
}
return ;
}
void prime(){
int i,j;
vis[]=true,mu[]=;
for(i=;i<=MAXN;i++){
if(!vis[i]){
f[i]=,p[i]=i,mu[i]=-;
pri[++cnt]=i;
}
for(j=;j<=cnt&&pri[j]*i<=MAXN;j++){
vis[i*pri[j]]=true;
if(i%pri[j]){
mu[i*pri[j]]=-mu[i];
f[i*pri[j]]=f[i],p[i*pri[j]]=p[i]*pri[j];
}
else{
mu[i*pri[j]]=;
f[i*pri[j]]=f[i]+(i%Sqr(pri[j],f[i])==);
p[i*pri[j]]=p[i];
break;
}
}
}
}
LL Sqr(LL x,int n){
LL ret=;
while(n){
if(n&)
ret*=x;
n>>=,x*=x;
}
return ret;
}
LL work(int a,int b){
int MIN=min(a,b),i,las;
LL ret=;
for(las=,i=;i<=MIN;las=i,i=min(a/(a/(las+)),b/(b/(las+)))){
ret+=(sum[i]-sum[las])*(1ll*a/i)*(1ll*b/i);
if(i==MIN)break;
}
return ret;
}

bzoj P3309 DZY Loves Math——solution的更多相关文章

  1. ●BZOJ 3309 DZY Loves Math

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

  2. 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 ...

  3. BZOJ 3309: DZY Loves Math

    3309: DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 761  Solved: 401[Submit][Status ...

  4. BZOJ 3512: DZY Loves Math IV [杜教筛]

    3512: DZY Loves Math IV 题意:求\(\sum_{i=1}^n \sum_{j=1}^m \varphi(ij)\),\(n \le 10^5, m \le 10^9\) n较小 ...

  5. bzoj 3309 DZY Loves Math 莫比乌斯反演

    DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1303  Solved: 819[Submit][Status][Dis ...

  6. bzoj 3462: DZY Loves Math II

    3462: DZY Loves Math II Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 211  Solved: 103[Submit][Sta ...

  7. bzoj 3560 DZY Loves Math V - 线性筛 - 扩展欧几里得算法

    给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). Input 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. Output 仅一行答案. Sampl ...

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

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

  9. 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} ...

随机推荐

  1. day 47 Django 4的简单应用 创建简单的图书管理 (单表的增删改查)

    前情提要  Django  已经学了大半.. 很多东西已经能够使用在生产环境当中 一:模糊查询 二:单表删除 三:单表修改 四:图书管理 图书管理操作 视图结构 A:路由层 A :配置路由文件 参数解 ...

  2. iOS-CocoaPods安装及使用

    1. 安装 Ruby 对于iOS开发者,CocoaPods是最方便的第三方管理工具了,但是怎么安装CocoaPods呢,安装CocoaPods之前,要确保mac已经安装上Ruby,但在安装Ruby时, ...

  3. Anaconda 入门详解

    Anaconda Anaconda简介 Anaconda是一个免费开源的Python和R语言的发行版本,用于计算科学(数据科学.机器学习.大数据处理和预测分析),Anaconda致力于简化包管理和部署 ...

  4. C# 连接Paradox DB

    Paradox数据库是一个成名于15年前的数据库,那时候Borland公司还存在.最近客户提出需求,要在一套用了12年+的应用程序上作些功能更改.这套应用程序使用Delphi+Paradox数据库. ...

  5. Kafka消息队列

    转自:http://blog.csdn.net/yfkiss/article/details/17348693 代码案例 http://blog.csdn.net/ganglia/article/de ...

  6. (转)mysql explain详解

    原文:http://www.cnblogs.com/xuanzhi201111/p/4175635.html http://yutonger.com/18.html http://www.jiansh ...

  7. linux内核模块的安全

    linux可以动态的加载内核模块,在很多场合可能需要确保加载内核的安全性.如果被攻击者加载恶意内核模块,将会使得内核变得极其危险. 当然,稳妥的做法就是给内核模块进行签名,内核只加载能正确验证的签名. ...

  8. C#设计模式系列目录

    http://www.cnblogs.com/libingql/archive/2012/04/16/2451608.html 抽空,学习,加强!

  9. android学习-数据存储(一)-----SQLite源码分析

    分析SQLiteDatabase.java,SQLiteStatement.java,SQLiteSession.java,SQLiteConnectionPool.java,SQLiteConnec ...

  10. php的explode()和split()的区别

    都是分割,区别就是,split要用转移字符: 1.   $test = end(explode('.', 'abc.txt'));    echo $test;//output txt   2.    ...