热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BZOJ2694:Lcm——包看得懂/看不懂题解

http:www.lydsy.comJudgeOnlineproblem.php?id2694Description对于任意的>1的ngcd(a,b)不是n^2的倍数也就是

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

对于任意的>1的n gcd(a, b)不是n^2的倍数
也就是说gcd(a, b)没有一个因子的次数>=2
Input
一个正整数T表示数据组数
接下来T行 每行两个正整数 表示N、M
Output
T行 每行一个整数 表示第i组数据的结果
Sample Input
4
2 4
3 3
6 5
8 3
Sample Output
24
28
233
178
——————————————————————————————————
觉得这一道题很有纪念意义所以准备用markdown好好用公式表达一下。

而且发现我所看的博客都或多或少存在一些问题,所以不再贴他们的博客地址了。

定义:一个函数\(f(x)\),当x包含平方因子的时候,\(f(x)=0\),否则\(f(x)=1\)

定义:一个函数\(sum(x)=\sum_{i=1}^x i\)

(如果你觉得下面的过程太冗杂了,请跳过大括号区域内的过程)

——————————————————————————————————

首先假设\(n,那么我们的答案最初为:

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

\(=\sum_{p=1}^n\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{p}*f(p)*[gcd(i,j)=p]\)

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

\(=\sum_{p=1}^n\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{p}\rfloor}\ pij*f(p) \sum_{d|gcd(i,j)}\mu(d)\)

\({\)

\(=\sum_{p=1}^n\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{p}\rfloor}\ pij*f(p) \sum_{d|gcd(i,j)}\mu(d)\)

\(=\sum_{p=1}^n\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{p}\rfloor}\ pij*f(p) \sum_{d|i\bigwedge d|j}\mu(d)\)

\(=\sum_{p=1}^n p*f(p)\sum_{d=1}^{\lfloor\frac{n}{p}\rfloor}\mu(d)\sum_{i=1\bigwedge d|i}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1\bigwedge d|j}^{\lfloor\frac{m}{p}\rfloor}\ ij\)

\(=\sum_{p=1}^n p*f(p)\sum_{d=1}^{\lfloor\frac{n}{p}\rfloor}\mu(d)\sum_{i=1\bigwedge d|i}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1\bigwedge d|j}^{\lfloor\frac{m}{p}\rfloor}\ ij\)

\(}\)

\(=\sum_{p=1}^n p*f(p)\sum_{d=1}^{\lfloor\frac{n}{p}\rfloor}\mu(d)\sum_{i=1}^{\lfloor\frac{n}{pd}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{pd}\rfloor}\ ijd^2\)

\(=\sum_{p=1}^n p*f(p)\sum_{d=1}^{\lfloor\frac{n}{p}\rfloor}\mu(d)*{d^2}sum({\lfloor\frac{n}{pd}\rfloor})sum({\lfloor\frac{m}{pd}\rfloor})\)

——————————————————————————————————

\(k=pd\),则\(p|k\),那么我们可以把sum函数提出并将式子整理得:

\(\sum_{k=1}^n sum({\lfloor\frac{n}{k}\rfloor})sum({\lfloor\frac{m}{k}\rfloor})*\sum_{p|k} p*f(p)*\mu(\frac{k}{p})*{({\frac{k}{p})}^2}\)

\(h(k)=\sum_{p|k} p*f(p)*\mu(\frac{k}{p})*{({\frac{k}{p})}^2}\),则可化简为:

\(\sum_{k=1}^n sum({\lfloor\frac{n}{k}\rfloor})sum({\lfloor\frac{m}{k}\rfloor})*h(k)\)

显然\(h(k)\)之前的那部分可以通过分块来实现\(O(\sqrt{n})\)求解,那么现在关键问题是求\(h(k)\)

根据各种迷之推导我们得出\(h(k)\)为积性函数,则我们可以用线性筛来求\(h(k)\)

分情况讨论,当\(k\)为质数的时候,显然带入解得\(h(k)=k(1-k)\)

\(k\)不为质数的时候,我们可以表示为\(k=x*p\)(p为质数),如果\(x\)\(p\)互质的话可以直接相乘,否则:

首先对\(x\)分解质因数为\(x={p1^{q1}}{p2^{q2}}{p3^{q3}}...{pk^{qk}}\),假设\(p=p1\),那么显然:

\(q1>=2\)\(f(x*p1)=0\),显然此时\(h(x*p1)=0\)

\(q1=1\)\(h(x*p1)=h(x/p1)*h(p1^2)\)(显然\(x/p1\)\(p1^2\)互质)

\(h(p^2)=1*f(1)*\mu(p^2)*{p^4}+p*f(p)*\mu(1)*{p^2}+{p^2}*f({p^2})*\mu(1)*1\)

\(=0-3p+0=-3p\)

\(\therefore h(x*p1)=-3p1*h(x/p1)\)

#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int N=4000010;
const int p=(1<<30)-1;
int f[N],su[N],g[N];
bool he[N];
inline int s(int x){
    return x*(x+1)>>1;
}
void Euler(int n){
    int tot=0;
    f[1]=1;    
    for(int i=2;i<=n;i++){    
    if(!he[i]){    
        su[++tot]=i;
        f[i]=i*(1-i);
    }
    for(int j=1;j<=tot;j++){
        int t=i*su[j];
        if(t>n)break;
        he[t]=1;
        if(i%su[j]==0){
        int x=i/su[j];
        if(x%su[j])f[t]=-su[j]*su[j]*su[j]*f[x];
        else f[t]=0;
        break;
        }
        else f[t]=f[i]*f[su[j]];
    }
    }
    for(int i=1;i<=n;i++)f[i]+=f[i-1];
    return;
}   
int main(){
    Euler(4000000);
    int t;
    scanf("%d",&t);
    while(t--){
    int n,m,ans=0;
    scanf("%d%d",&n,&m);
    if(n>m)swap(n,m);
    for(int i=1,j;i<=n;i=j+1){
        j=min(n/(n/i),m/(m/i));
        ans+=(f[j]-f[i-1])*s(n/i)*s(m/i);
    }
    printf("%d\n",ans&p);
    }
    return 0;
}

推荐阅读
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 洛谷 P4035 [JSOI2008] 球形空间生成器(高斯消元法 / 模拟退火算法)
    本文介绍了洛谷 P4035 [JSOI2008] 球形空间生成器问题的解决方案,主要使用了高斯消元法和模拟退火算法。通过这两种方法,可以高效地求解多维空间中的球心位置。文章提供了详细的算法模板和实现代码,适用于 ACM 竞赛和其他相关应用场景。数据范围限制在 10 以内,确保了算法的高效性和准确性。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本报告对2018年湘潭大学程序设计竞赛在牛客网上的时间数据进行了详细分析。通过统计参赛者在各个时间段的活跃情况,揭示了比赛期间的编程频率和时间分布特点。此外,报告还探讨了选手在准备过程中面临的挑战,如保持编程手感、学习逆向工程和PWN技术,以及熟悉Linux环境等。这些发现为未来的竞赛组织和培训提供了 valuable 的参考。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 题目《BZOJ2654: Tree》的时间限制为30秒,内存限制为512MB。该问题通过结合二分查找和Kruskal算法,提供了一种高效的优化解决方案。具体而言,利用二分查找缩小解的范围,再通过Kruskal算法构建最小生成树,从而在复杂度上实现了显著的优化。此方法不仅提高了算法的效率,还确保了在大规模数据集上的稳定性能。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
author-avatar
aspzc
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有