Description

对于正整数 n n,定义f(n)f(n)为 n n所含质因子的最大幂指数。例如f(1960)=f(23∗51∗72)=3f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1 f(10007)=1, f(1)=0 f(1)=0
给定正整数 n,m n,m,求 ∑ni=1∑mj=1f(gcd(i,j)) \sum_{i=1}^n \sum_{j=1}^m f(gcd(i,j))

Solution

以为自己要独立完成人生中第一道有点难度的数论了。。然而因为常数大被卡掉了。。
化解的过程蛮简单

∑i=1n∑j=1mf(gcd(i,j))

\sum_{i=1}^n \sum_{j=1}^m f(gcd(i,j))

=∑d∑i=1⌊nd⌋∑j=1⌊md⌋f(d)∗[gcd(i,j)=1]

=\sum_d \sum_{i=1}^{\lfloor \frac{n}{d}\rfloor} \sum_{j=1}^{\lfloor\frac{m}{d}\rfloor} f(d)*[gcd(i,j)=1]

=∑d∑i=1⌊nd⌋∑j=1⌊md⌋f(d)∗∑d′|gcd(i,j)μ(d′)

=\sum_d \sum_{i=1}^{\lfloor \frac{n}{d}\rfloor} \sum_{j=1}^{\lfloor\frac{m}{d}\rfloor} f(d)*\sum_{d^{'}|gcd(i,j)}\mu(d^{'})
令 a=⌊nd⌋ b=⌊md⌋ a=\lfloor \frac n d \rfloor\ b=\lfloor \frac m d \rfloor

=∑d∑i=1a∑j=1bf(d)∗∑d′⌊ad′⌋⌊bd′⌋μ(d′)

=\sum_d \sum_{i=1}^{a} \sum_{j=1}^{b} f(d)*\sum_{d^{'}}\lfloor\frac a {d^{'}}\rfloor \lfloor \frac b {d^{'}}\rfloor \mu(d^{'})

=∑D⌊nD⌋⌊mD⌋∑d|Df(Dd)∗μ(d)

=\sum_D\lfloor\frac n D \rfloor \lfloor \frac m D\rfloor \sum_{d|D} f(\frac D d)*\mu(d)
然后令 g(n)=∑d|nμ(d)∗f(nd) g(n)=\sum_{d|n}\mu(d)*f(\frac n d)
原式可以化简为

=∑D⌊nD⌋⌊mD⌋g(D)

=\sum_D\lfloor\frac n D \rfloor \lfloor \frac m D\rfloor g(D)
只要得到 g g的值,然后按值域封装即可
关键是gg的值如何得到

我一开始是这么想的:
这种类似卷积形式的求和式都可以以 nlnn n ln n的复杂度得到
我枚举 d d,枚举nd\frac n d,得到 f f
再做一次得到gg
然后好了
本地测评预处理4S
交上去被卡掉了。。
但蛮有意义放下代码

Code 1

/**************************************************************Problem: 3309User: bblss123Language: C++Result: Time_Limit_Exceed
****************************************************************/#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;
typedef long long ll;
const int M=1e7+5;
int _,t,prime[M],g[M],f[M],mu[M];
bool mark[M];
ll sum[M];
inline void Max(int &a,int &b){if(a<b)a=b;
}
inline void Euler(){mu[1]=1;for(int i=2;i<M;++i){if(!mark[i])prime[t++]=i,mu[i]=-1;for(int j=0,p;j<t&&(p=prime[j])*i<M;++j){mark[p*i]=1;if(i%p==0){mu[i*p]=0;break;}mu[i*p]=-mu[i];}}for(int i=0,d;d=prime[i],i<t;++i){for(int k=1,w;(w=k*d)<M;++k)Max(f[w],g[w]=g[k]+1);for(int k=d;k<M;k+=d)g[k]=0;}for(int d=1;d<M;++d)for(int k=1,w;(w=k*d)<M;++k)g[w]+=mu[k]*f[d];for(int i=1;i<M;++i)sum[i]=sum[i-1]+g[i];
}
inline void rd(int &a){a=0;char c;while(c=getchar(),!isdigit(c));do a=a*10+(c^48);while(c=getchar(),isdigit(c));
}
int n,m;
inline void gao(){rd(n),rd(m);ll ans=0;for(int D=1;D<=min(n,m);++D){int last=min(n/(n/D),m/(m/D));ans+=1ll*(n/D)*(m/D)*(sum[last]-sum[D-1]);D=last;}printf("%lld\n",ans);
}
int main(){Euler();for(cin>>_;_--;)gao();
}

于是就当我以为又要卡常数的时候,手贱把 g g的值给打出来了,发现值域和μ\mu完全一样。。
然后我开始用容斥推导
意识流地得到了通项式。。
然而意识流,所以去查证明
Claris好神,一眼流地得出通项式,orz 然而等于没看
其他地方连一眼流都没有。。
逛来逛去又回到了PoPoQQQ大爷那
证法通俗易懂,我来抄袭一下

先说公式:
令 n=Πsi=1pαii n=\Pi_{i=1}^s p_i^{\alpha_i}
(1):当 αi \alpha_i的值完全一样的时候, g(n) g(n)有非零值 (−1)k+1 (-1)^{k+1}
(2):其余时候值为0

证明:
令 mx=maxsi=1αi mx=\max_{i=1}^s \alpha_i
注意 μ(d) \mu(d)只在 d=Πsi=1p0 or 1i d=\Pi_{i=1}^s p_i^{0\ or\ 1}时有非零值
那么所有 αi \alpha_i至多减 1 1
那么我们可以把所有αi\alpha_i划分为两个集合 A,B A,B
其中 A A中的元素全部等于mxmx, B B中的元素不等于mxmx
考虑 d d使哪些αi\alpha_i减了 1 1
显然gg值由 A A中的元素决定
假定AA中有元素被选到
则对于 B B集合的奇偶选择可能性相同,又由μ\mu的性质,知道当前答案为 0 0
那么对于AA中没有元素选取到呢?
同样的,对 B B进行如上讨论,考虑把BB集合给划分成 A′ A^{'}和 B′ B^{'},然后同样讨论(就好像一个递归),最后显然可以得到0的答案,则(2)式成立。
现在再来看(1)式就简单多了,直接容斥即可

这样的话 g <script type="math/tex" id="MathJax-Element-344">g</script>可以直接在线性筛里得到

Code 2

/**************************************************************Problem: 3309User: bblss123Language: C++Result: AcceptedTime:11156 msMemory:216136 kb
****************************************************************/#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;
typedef long long ll;
const int M=1e7+5;
int _,t,prime[M>>2],g[M],a[M],pre[M];
ll sum[M];
bool mark[M];
inline void Max(int &a,int &b){if(a<b)a=b;
}
inline void Euler(){for(int i=2;i<M;++i){if(!mark[i])prime[t++]=pre[i]=i,g[i]=a[i]=1;for(int j=0,p;j<t&&(p=prime[j])*i<M;++j){mark[p*i]=1;if(i%p==0){a[p*i]=a[i]+1;pre[p*i]=pre[i]*p;int k=i/pre[i];if(k==1)g[p*i]=1;else g[p*i]=a[k]==a[p*i]?-g[k]:0;break;}a[i*p]=1;pre[i*p]=p;if(a[i]==1)g[i*p]=-g[i];}}for(int i=1;i<M;++i)sum[i]=sum[i-1]+g[i];
}
inline void rd(int &a){a=0;char c;while(c=getchar(),!isdigit(c));do a=a*10+(c^48);while(c=getchar(),isdigit(c));
}
int n,m;
inline int gcd(int n,int m){return m?gcd(m,n%m):n;
}
inline void nt(ll x){if(!x)return;nt(x/10);putchar(48+x%10);
}
inline void pt(ll x){if(!x)putchar('0');else nt(x);
}
inline void gao(){rd(n),rd(m);ll ans=0;for(int D=1;D<=min(n,m);++D){int last=min(n/(n/D),m/(m/D));ans+=1ll*(n/D)*(m/D)*(sum[last]-sum[D-1]);D=last;}pt(ans),putchar('\n');
}
int main(){Euler();for(rd(_);_--;)gao();
}


BZOJ 3309: DZY Loves Math相关推荐

  1. 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) ...

  2. bzoj 3739 DZY loves math VIII

    3739: DZY loves math VIII Time Limit: 25 Sec Memory Limit: 512 MB Submit: 318 Solved: 50 [Submit][St ...

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

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

  4. 3309: DZY Loves Math

    全程%popoqqq:题解 orz:求g[i]函数(太神了) 现在我们只需要知道Σ[d|T]f(d)μ(T/d)的前缀和就行了 设这个函数为g(x) 观察这个函数 由于含平方因子数的μ值都为零,因此我 ...

  5. DZY Loves Math 系列详细题解

    BZOJ 3309: DZY Loves Math I 题意 \(f(n)\) 为 \(n\) 幂指数的最大值. \[ \sum_{i = 1}^{a} \sum_{j = 1}^{b} f(\gcd ...

  6. 【BZOJ3309】DZY Loves Math

    3309: DZY Loves Math Time Limit: 20 Sec Memory Limit: 512 MB Submit: 411 Solved: 161 [Submit][Status ...

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

    [BZOJ3512]DZY Loves Math IV(杜教筛) https://www.cnblogs.com/cjyyb/p/10165338.html

  8. BZOJ3560 DZY Loves Math V

    原题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3560 DZY Loves Math V Description 给定n个正整数a1,a2 ...

  9. DZY Loves Math系列

    link 好久没写数学题了,再这样下去吃枣药丸啊. 找一套应该还比较有意思的数学题来做. [bzoj3309]DZY Loves Math 简单推一下. \[\sum_{i=1}^n\sum_{j=1 ...

最新文章

  1. python修改文件内容_Python批量修改文本文件内容的方法详解
  2. 通过XML文件生成View
  3. android api在线文档_通过 API 远程管理 Jenkins
  4. 25-60k/m | 湃道智能招聘
  5. 计算机软件职业资格证书查询,电子社保卡可查询职业资格证书啦!
  6. xlsxwriter php,Xlsxwriter
  7. springboot快速搭建文件管理系统
  8. Android7.0的xposed框架,Android 7.x 安装Xposed框架
  9. 微信公众号答题功能搭建
  10. python自然语言的背景_Python自然语言工具包(NLTK)入门
  11. 北京小升初计算机编程特长生班,北京特长生小升初测试启动 家长凌晨排队取号 图...
  12. python新技术_2020年令人期待的Python新功能
  13. 文件管理系统软件---爱米云网盘
  14. 成都拓嘉启远电商:拼多多账号异常怎么回事
  15. 会计设计计算机专业前景,会计、英语、艺术设计、土木工程、计算机5个专业毕业生超10万人...
  16. Ubuntu16.04下载截屏录屏软件
  17. Linux-comm
  18. 逍遥模拟器导出文件到电脑
  19. 石家庄铁道大学毕业设计计算机,石家庄铁道大学毕业设计.doc
  20. Windows 下安装 CUDA 和 Pytorch

热门文章

  1. python入门之左移,右移,按位与,按位或,按位异或,按位取反
  2. QML Canvas 绘制文本
  3. 24种工具,跨境电商
  4. 一步步教你打造属于自己的FLV播放器,动态调用外部影片!~
  5. 红蓝对抗模拟演练系统软件解决方案
  6. 【YOLO系列】YOLOv5超详细解读(网络详解)
  7. 从今天开始,没有「Office」了!
  8. K-means算法介绍
  9. 计算机计划300字作文,计划作文300字6篇
  10. sql server,求出每个班级中的人的最大年龄的所有信息