数论神题——进击的羊角兽

数论神题

进击的羊角兽

题目描述:

求满足 \(a+b|ab(a,b \leq n,a \neq b)\)的有序数对\((a,b)\)的个数。

solution

\((a,b)=d , (a < b \leq n)\),则$ a=xd , b=yd , ( x < y )$

\(a+b|ab\)

\(=(x+y)d|xyd^2\)

\(\because (x+y, x)=1,(x+y, y)=1\)

\(\therefore (x+y)|d\)

$\therefore x < y \leq \sqrt{n} $

\(d=z(x+y)\),则\(a=xz(x+y) , b=yz(x+y)\)

即原问题为求数对\((x, y, z)( x < y \leq \sqrt{n}, z \leq \lfloor \frac {n}{y(x+y)} \rfloor)\)

\[Ans=\sum_{x < y} \sum_{(x, y)=1} \lfloor \frac {n}{y(x+y)} \rfloor\]

\[=\sum_{x < y} \sum_{d=(x, y)}\varepsilon(d) \lfloor \frac {n}{y(x+y)} \rfloor\]

\[=\sum_{x < y} \sum_{d|(x,y)} \mu(d) \lfloor \frac {n}{y(x+y)} \rfloor\]

\[=\sum_{x < y,d|x,d|y} \mu(d) \lfloor \frac {n}{y(x+y)} \rfloor\]

\(x=x'd, y=y'd\)

\[=\sum_{x' < y'} \mu(d) \lfloor \frac {n}{y'(x'+y')d^2} \rfloor\]

为了方便,下面的\(x',y' \text 用回 x,y \text 表示\)

\[=\sum_{x < y} \mu(d) \lfloor \frac {n}{y(x+y)d^2} \rfloor (d \leq \sqrt{n})\]

现在就来解释一下上面的\(\varepsilon(), \mu()\)

这个是莫比乌斯函数的性质。
282059236301495.png

这样只有当\((x,y)=1\)时,\(\lfloor \frac {n}{y(x+y)} \rfloor\) 才会被算进去。

\(\mu(n)\)很容易就可以算出来,显然当\(n=1\)\(\mu(1)=1\),对于一个数\(n\),它的所有约数的\(\mu()\)的和为\(0\),而\(n\)的其中一个约数就是\(n\),小于\(n\)\(\mu()\)又已经算出来了,就可以把\(\mu(n)\)算出来。

\[\sum_{x < y} \mu(d) \lfloor \frac {n}{y(x+y)d^2} \rfloor (d \leq \sqrt{n})\]

\[f(t)=\sum_{x < y} \lfloor \frac {t}{y(x+y)} \rfloor\]

\[Ans=\sum_{x < y} \mu(d)f(\frac {n}{d^2})\]

\[f(t)=\sum_{x < y} \lfloor \frac {t}{y(x+y)} \rfloor\]

\[=\sum_{x < y, z \leq \lfloor \frac {t}{y(x+y)} \rfloor} 1\]

\[=\sum_{x \leq y-1, y(x+y) \leq \lfloor \frac {t}{z} \rfloor} 1\]

\[=\sum_{x \leq y-1, x \leq \lfloor \frac {t}{zy} \rfloor -y} 1\]

282105474748895.png
\[f(t)=\sum h(\lfloor \frac {t}{z} \rfloor)\]

终于都推完了。

答案记得乘2

分析一下时间复杂度。

\(h(s)\):因为最小值要比大于\(0\),所以\(y \leq \sqrt {s}\),而\(s=\lfloor \frac {t}{z} \rfloor=\lfloor \frac {n}{zd^2} \rfloor\),所以\(s\)最多有\(2\sqrt {n}\)个,时间复杂度为:

\[\int_{0}^{\sqrt {n}} (\sqrt {x} + \sqrt { \frac {n}{x}} ) \mathrm{d}x\]

\(f(s)\):分析同上,一个\(f(s)\)需要\(\sqrt {s}\)的时间

\(Ans\):枚举\(d\)\(\sqrt {n}\),算\(f(s)\)需要\(\sqrt {s}\)的时间,总的时间复杂度为:

\[\int_{0}^{\sqrt {n}} (\sqrt {x} + \sqrt { \frac {n}{x}} ) \mathrm{d}x\]

预处理\(h(s)\),所以整个算法的时间为:

\[\int_{0}^{\sqrt {n}} (\sqrt {x} + \sqrt { \frac {n}{x}} ) \mathrm{d}x\]

\[=\frac {8}{3} n^{ \frac {3}{4}}\]

贴代码:

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <map>
#include <deque>
#include <queue>
using namespace std;typedef long long LL;
const int maxn=int(1e6)+100;LL n, ans;
int qn;
LL u[maxn], h[maxn], hv[maxn];void getu()
{for (int i=1; i<=qn; ++i) u[i]=1;for (int i=2; i<=qn; ++i){u[i]=-u[i];for (int j=2; i*j<=qn; ++j) u[i*j]+=u[i];}
}
LL geth1(LL num)
{int cut=(sqrt(1+8*num)+1)*0.25;int fi=(int)floor(sqrt(num));LL ret=LL(cut-1)*cut/2-(LL)(cut+1+fi)*(fi-cut)/2;for (int i=cut+1; i<=fi; ++i)ret+=num/i;return ret;
}
void geth()
{for (int i=1; i<=qn; ++i){h[i]=geth1(i);hv[i]=geth1(n/i);           }
}
LL getf(LL num)
{LL f=0;int fi=(int)floor(sqrt(num));for (int i=1; i<=fi; ++i)f+=h[i]*(num/i-num/(i+1));for (int i=1; i<=fi; ++i){if (num / i <= fi) continue;if (num/i>sqrt(n)) f+=hv[n/(num/i)];else f+=h[num/i];}/*if (LL(sqrt(num))*LL(sqrt(num))==num)f-=h[LL(sqrt(num))];*/return f;
}
void solve()
{getu();geth();for (int i=1; i<=qn; ++i)ans+=u[i]*getf(n/((long long)i*i));
}
int main()
{freopen("nixgnoygnay.in", "r", stdin);freopen("nixgnoygnay.out", "w", stdout);scanf("%I64d", &n);qn=(int)floor(sqrt(n));solve();printf("%I64d\n", ans*2);return 0;
}

转载于:https://www.cnblogs.com/GerynOhenz/p/4464017.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

靶场练习第一天~vulnhub靶场之Me-and-My-Girlfriend-1

兄弟们第一天打vulnhub靶场&#xff0c;我kali连靶场ip都扫不到&#xff0c;泪奔了&#xff0c;不说了开整 注意&#xff1a; vm虚拟机里面的编辑下面的虚拟机网络编辑器&#xff0c;把除了NAT模式外的模式&#xff0c;其他模式不启动。 至于为什么要这样操作&#xff0c;感觉…

靶场练习第二天~vulnhub靶场之 THE PLANETS: EARTH

前期准备&#xff1a; 靶机下载链接: https://pan.baidu.com/s/1_w8OZOPVsQaojq2rnKcdRA 提取码: gguw kali攻击机ip&#xff1a;192.168.101.10 靶机地址&#xff1a;192.168.101.101 一、信息收集 1.nmap扫描 因为kali与靶机在同一个网段下&#xff0c;使用nmap 192.168…

测试与封装5.1

我的队友是52吴舒婷&#xff0c;博客内容主要是白盒黑盒的测试数据分析 我们通过简单的四则运算来进行程序的测试与封装 我们主要完成的是事情 &#xff08;1&#xff09;封装&#xff1a;将运算要运用的方法进行封装 文件主要有三个&#xff1a;Calculate&#xff08;存放运算…

springmvc学习笔记--mybatis--使用插件自动生成实体和mapper

由于表对象在开发过程中会增删字段&#xff0c;有时候需要重新生成实体和对应的mapper&#xff0c;这时候可以通过mybatis的插件的生成。 优点是快速简洁&#xff0c;缺点同样很明显&#xff1a;覆盖。因此&#xff0c;通常是在第一次搭建框架的时候使用&#xff0c;因为开发过…

靶场练习第三天~vulnhub靶场之narak

靶机下载链接: https://pan.baidu.com/s/1GxcSL6efwd0GcbY45WsD0A 提取码: dhr5 一、信息收集 1.使用namp 192.168.101.0/24扫描该网段的地址&#xff0c;寻找靶机IP 2.直接访问192.168.101.102 3.进行目录扫描&#xff0c;dirb目录扫描工具&#xff08;kali自带的&#xff…

靶场练习第四天~vulnhub靶场之Lazysysadmin

靶机下载链接: https://pan.baidu.com/s/1MMkgaYLRc78YX4s6nvqdjQ 提取码: djpm 信息收集 查看kali的IP 使用nmap 192.168.101.0/24 探测靶机IP 发现开放445端口&#xff0c;并且开放的服务microsoft-ds。可以用enum4linux工具来扫描共享文件&#xff0c;使用方法: enum4linux…

关于代码手写UI,xib和StoryBoard

代码手写UI 这种方法经常被学院派的极客或者依赖多人合作的大型项目大规模使用。Geek们喜欢用代码构建UI&#xff0c;是因为代码是键盘敲出来的&#xff0c;这样可以做到不开IB&#xff0c;手不离开键盘就完成工作&#xff0c;可以专注于编码环境&#xff0c;看起来很cool很高效…

靶场练习第五天~vulnhub靶场之basic_pentesting_1

一、信息收集 1.主机发现 靶机下载链接: https://pan.baidu.com/s/143q3cbZG6-8y8kMk51Lc_Q 提取码: i8hv &#xff08;1&#xff09;Netdiscover&#xff1a;专用的二层发现工具&#xff0c;拥有主动和被动发现两种方式 具体操作如下&#xff0c;查看一下kali的ip 然后使用…

计算机网络学习笔记(二) 计算机网络结构

什么是网络结构&#xff1f; n 网络边缘: 主机网络应用 n 接入网络&#xff0c;物理介质:有线或无线通信链路 n 网络核心&#xff08; 核心网络&#xff09; :互联的路由器&#xff08;或分组转发设备&#xff09;网络之网…

Javascript常用的设计模式详解

Javascript常用的设计模式详解 阅读目录 一&#xff1a;理解工厂模式二&#xff1a;理解单体模式三&#xff1a;理解模块模式四&#xff1a;理解代理模式五&#xff1a;理解职责链模式六&#xff1a;命令模式的理解&#xff1a;七&#xff1a;模板方法模式八&#xff1a;理解ja…

靶场练习第六天~vulnhub靶场之Lampiao

靶机下载链接: https://pan.baidu.com/s/1h0uiwvBkX8iXFyMAO23e1A 提取码: 2kjp 一、信息收集 1.靶机发现 &#xff08;1&#xff09;靶机lampiao与kali均为NAT模式 ,Kali的 IP为192.168.101.10, 扫描网段用命令nmap -sp192.168.101.0/24&#xff0c;发现靶机ip为192.168.10…

内存泄露从入门到精通三部曲之排查方法篇

最原始的内存泄露测试 重复多次操作关键的可疑的路径&#xff0c;从内存监控工具中观察内存曲线&#xff0c;是否存在不断上升的趋势且不会在程序返回时明显回落。这种方式可以发现最基本&#xff0c;也是最明显的内存泄露问题&#xff0c;对用户价值最大&#xff0c;操作难度小…

靶场练习第七天~vulnhub靶场之mrRobot

靶机下载链接: 百度网盘 请输入提取码 提取码: sqv3 一、主机发现 1.用ifconfig查看kali的ip&#xff0c;因为kali和靶机都开启了NAT模式&#xff0c;使用namp -sP 192.168.101.0/24探测靶机ip 二、信息收集 1.使用nmap扫描靶机 使用nmap -A 192.168.101.108 &#xff0c;查…

JAVA第二次试验

北京电子科技学院&#xff08;BESTI&#xff09; 实 验 报 告 课程&#xff1a;Java程序设计 班级&#xff1a;1352 姓名&#xff1a;潘俊洋 学号&#xff1a;20135230 成绩&#xff1a; 指导教师:娄嘉鹏 实验日期:2015.5.4 实验密级&#xff1a…

靶场练习第八天~vulnhub靶场之CH4INRULZ_v1.0.1

一、前期准备 1.靶机下载 链接: 百度网盘 请输入提取码 提取码: z37y 2.用命令ifconfig查看kali 二、信息收集 1.主机发现&#xff0c;使用nmap命令 具体使用方法&#xff1a;nmap -sP 192.168.101.0/24 2.查看该靶机开放了哪些端口 nmap -A 192.168.101.109 直接访问80端…

TImus 1073 Square Country DP

题意&#xff1a;给出一个数n(1<n<60000),这个数可以写成一些数的平方的和&#xff0c; 问对于n&#xff0c;最少可以分成多少个数的平方的和。 比如&#xff1a;n344&#xff0c;则34418*184*42*2&#xff0c;输出3. dp[i]表示i这个数最少可以分成多少个数的平方的和。 …

vulnhub靶机获取不到ip

1.启动靶机&#xff0c;出现如下图所示&#xff0c;按e 2.进入如下图所示时&#xff0c;将ro 替换为 rw signie init/bin/bash 3.按下Ctrl键X键&#xff0c;重启服务进入如下界面 4.查看当前网卡IP信息 ip a 5.编辑网卡配置文件vi /etc/network/interfaces 6.发现网卡名字与刚…

apache整合tomcat部署集群

近日&#xff0c;由于公司项目需要&#xff0c;所以学习了apache整合tomcat以及集群的一些知识。 所以做下笔记日后回顾可以用到。 apache只有处理静态事物的能力&#xff0c; 而tomcat的强项就是处理动态的请求&#xff0c;所以apache和tomcat整合相互取长补短&#xff0c;由a…

靶场练习第九天~vulnhub靶场之dc-1

一、环境搭建 靶场下载链接: 百度网盘 请输入提取码 提取码: ih67 1.查看kali的ip&#xff1a;ifconfig 二、信息收集 1.使用namp命令 主机探测: nmap -sP 192.168.101.0/24 查看靶机开放端口号和服务:nmap -A 192.168.101.111 发现开放80端口,访问一下192.168.101.111 Dru…

靶场练习第十天~vulnhub靶场之dc-2

一、准备工作 靶机下载地址链接: 百度网盘 请输入提取码 提取码: ib86 二、信息收集 1.nmap的信息收集 &#xff08;1&#xff09;使用nmap 192.168.101.0/24&#xff0c;发现靶机地址为192.168.101.115 &#xff08;2&#xff09;对靶机做进一步探测&#xff0c;发现靶机开…