【集训】练习题 uria
Description
求有多少组正整数对 \((a, b)\) 满足
- \(a + b ≤ n\)
- \(a + b | ab\)
\(n ≤ 10^14\)
Solution
这题有点绕啊
设 \(gcd(a,b)=d\),\(a=a'd\),\(b=b'd\)
对于第二个式子:\((a'+b')d | a'b'd^2\),所以 \(a'+b' | a'b'd\)
然后因为已经提出来了一个 \(d\) , 所以\(gcd(a',b')=1\) 即 \(a'\bot b'\)
所以 \(gcd(a'+b',a')=gcd(a'+b',b')=gcd(a',b')=1\)(模拟exgcd的过程)
意思就是 \(a'\) 和 \(b'\) 均不包含 \(a'+b'\) 的任意因数,所以 \(a'b'\) 也肯定不整除 \(a'+b'\)
所以 \(a'+b' | d\)
那么有了这个时候,对于第一个式子:\((a'+b')d \leq n\),而 \(a'+b' | d\) ,所以 \(a'+b' \leq \sqrt n\)
然后我们设 \(t=a'+b'\),从 \(2\) 到 \(\sqrt n\) 枚举,每次算 \(t\) 固定后每个 \(t\) 的贡献
- 固定了 \(t\) 后,就要找 \(d\) 有多少种取值
设 \(d=mt\),\(d\) 有多少种取值就是 \(m\) 有多少种取值
看第一个式子,代进去,\(t^2m\leq n\),所以只要 \(m\leq \frac{n}{t^2}\),就都可以
所以 \(m\) 共有 \(\lfloor \frac{n}{t^2}\rfloor\) 种取值,所以 \(d\) 有 \(\lfloor \frac{n}{t^2}\rfloor\) 种取值 - 再看固定了 \(t\) 后,把 \(t\) 分解成互质的 \(a'\) 和 \(b'\) 有多少种方案
我们要求有多少 \(a'\) 和 \(b'\) ,\(a'+b'=t\),\(a'\bot b'\)
因为\(gcd(a',b')=1\),所以\(gcd(a',t-a')=1\),根据更相减损术,\(gcd(a',t)=1\),\(a'\)有多少取值,分解 \(a'\) 和 \(b'\) 就有多少方案
而 \(a'\) 的取值方案就是 \(\phi (t)\)了
所以最后的答案就是\(ans=\sum_{i=2}^{\sqrt n}\lfloor \frac{n}{i^2}\rfloor\phi (i)\)
预处理后枚举求和
#include<bits/stdc++.h>
#define ll long long
#define db double
#define ld long double
const int MAXN=10000000+10;
int cnt,vis[MAXN],prime[MAXN];
ll phi[MAXN],n,res;
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char c='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(c!='\0')putchar(c);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void init()
{
memset(vis,1,sizeof(vis));
vis[0]=vis[1]=0;
phi[1]=1;
for(register int i=2;i<MAXN;++i)
{
if(vis[i])
{
prime[++cnt]=i;
phi[i]=i-1;
}
for(register int j=1;j<=cnt&&i*prime[j]<MAXN;++j)
{
vis[i*prime[j]]=0;
if(i%prime[j])phi[i*prime[j]]=phi[i]*phi[prime[j]];
else
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
}
}
}
int main()
{
init();
read(n);
for(register ll i=2,limit=sqrt(n);i<=limit;++i)res+=(n/(i*i))*phi[i];
write(res,'\n');
return 0;
}
【集训】练习题 uria的更多相关文章
- 【loj6029】「雅礼集训 2017 Day1」市场&&【uoj#228】基础数据结构练习题
题解: 这两道题加上区间取min max应该算线段树几道比较不寻常的题目 其实也是挺好理解的 对于区间/d 显然在log次后就会等于0 而我们注意到如果区间中数都相等那么就可以一起除 也就是说每个区间 ...
- 2019牛客国庆集训派对day1 K题 双向链表练习题 splay区间翻转
题目链接: 解法: 先建n颗平衡树,合并的时候将a中最右的结点翻转到根节点,b中最左的结点翻转到根节点,对合并后的根节点进行标记. #include <bits/stdc++.h> usi ...
- [集训]FWT基础练习题
题意 给出n个长度为20的二进制数和数字k,每次询问给出一个二进制数,问从n个数中挑k个数(不能重复)的按位或能包含询问的组合有多少个.数字均小于等于5E5,1s. 思考 强行算出2^20个答案,再O ...
- 高考集训讲课(To 高一)
高考集训讲课(To 高一) 主要是怕下午讲着讲着把自己讲懵了,有一定的迷糊概率 经过机房的讨论,一致认为插头\(DP\)实用性不大,所以这次不讲了,先把重要的讲一讲. 顺便吐槽一下,凭什么另外几个人都 ...
- QDEZ集训笔记【更新中】
这是一个绝妙的比喻,如果青岛二中的台阶上每级站一只平度一中的猫,差不多站满了吧 自己的理解 [2016-12-31] [主席树] http://www.cnblogs.com/candy99/p/61 ...
- Linux基础练习题(二)
Linux基础练习题(二) 1.复制/etc/skel目录为/home/tuer1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@www ~]# cp -r ...
- shell 脚本之 shell 练习题汇总
整理了一些 shell 相关的练习题,记录到这里. 1. 请按照这样的日期格式 xxxx-xx-xx 每日生成一个文件,例如:今天生成的文件为 2013-09-23.log, 并且把磁盘的使用情况写到 ...
- MySQL练习题
MySQL练习题 一.表关系 请创建如下表,并创建相关约束 二.操作表 1.自行创建测试数据 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 3.查询平均成绩大于60分的同学的学号和平均成 ...
- MySQL练习题参考答案
MySQL练习题参考答案 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 思路: 获取所有有生物课程的人(学号,成绩) - 临时表 获取所有有物理课程的人(学号,成绩) - 临时表 根据[ ...
随机推荐
- 实现activity跳转动画的若干种方式
第一种: (使用overridePendingTransition方法实现Activity跳转动画) 在Activity中代码如下 /** * 点击按钮实现跳转逻辑 */ button1.setOnC ...
- 《杜增强讲Unity之Tanks坦克大战》8-子弹碰撞处理
8 子弹碰撞处理 为了处理子弹打到坦克的伤害我们在这里新建一个Shell.cs 子弹有两种情况,碰到坦克炸开,没有碰到坦克则过2s子弹销毁. void Start () { Destroy (game ...
- jar包冲突常用的解决方法
jar包冲突常见的异常为找不到类(java.lang.ClassNotFoundException).找不到具体方法(java.lang.NoSuchMethodError).字段错误( java.l ...
- git解决代码提交冲突
树冲突文件名修改造成的冲突,称为树冲突.比如,A同事把文件改名为A.C,B同事把同一个文件改名为B.C,那么B同事将这两个commit合并时,会产生冲突.如果最终确定用B同事的文件名,那么解决办法如下 ...
- ClassLoader.loadClass()与Class.forName()的区别
ClassLoader.loadClass()与Class.forName()都是反射用来构造类的方法,但是他们的用法还是有一定区别的. 在讲区别之前,我觉得很有不要把类的加载过程在此整理一下. 在J ...
- 机器学习算法 --- Decision Trees Algorithms
一.Decision Trees Agorithms的简介 决策树算法(Decision Trees Agorithms),是如今最流行的机器学习算法之一,它即能做分类又做回归(不像之前介绍的其他学习 ...
- ifconfig命令详情
基础命令学习目录首页 原文链接:https://blog.csdn.net/weixin_37886382/article/details/79716879 许多windows非常熟悉ipconfig ...
- 第十次ScrumMeeting博客
第十次ScrumMeeting博客 本次会议于11月5日(日)22时整在新主楼G座2楼召开,持续20分钟. 与会人员:刘畅.辛德泰.窦鑫泽.张安澜.赵奕.方科栋. 特邀嘉宾:陈彦吉学长. 1. 每个人 ...
- CentOS 6.7 安装配置 nagios
一.简介 Nagios是一款开源的免费网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报警,第一时间 ...
- 使用sql查询mysql/oracle/sql server/gp数据库中指定表的字段信息(字段名/字段类型/字段长度/是否是主键/是否为空)
1,根据数据库类型拼接不同URL /** * 根据类型不同拼接连接的URL * @param dbType 1:mysql.2:oracle.3:sql server.4:gp * @param ip ...