LOJ6482. LJJ 爱数数
题目描述:戳这里
题解:
1 a + 1 b = 1 c \frac{1}{a}+\frac{1}{b}=\frac{1}{c} a1+b1=c1
( a + b ) c = a b (a+b)c=ab (a+b)c=ab
令 g = g c d ( a , b ) , A = a g , B = b g 令g=gcd(a,b),A=\frac{a}{g},B=\frac{b}{g} 令g=gcd(a,b),A=ga,B=gb
( A + B ) c = A B g (A+B)c=ABg (A+B)c=ABg
由 于 g 要 整 除 等 式 左 边 的 东 西 , 然 而 g 不 整 除 c , 所 以 g 整 除 A + B , 那 么 可 以 除 过 去 由于g要整除等式左边的东西,然而g不整除c,所以g整除A+B,那么可以除过去 由于g要整除等式左边的东西,然而g不整除c,所以g整除A+B,那么可以除过去
A + B g = A B c \frac{A+B}{g}=\frac{AB}{c} gA+B=cAB
我们假设这个式子两边都等于p。
那么如果 p ! = 1 p!=1 p!=1,说明p整除A或者B,p不可能同时整除A和B,因为A、B互质。但是p要整除 A + B A+B A+B,所以不可能成立。
所以可以推出 p = 1 p=1 p=1。
那么就可以推出两条式子:
A + B = g , 即 是 : a + b = g 2 A+B=g,即是:a+b=g^2 A+B=g,即是:a+b=g2
c = A B , 就 是 : c = a b g 2 c=AB,就是:c=\frac{ab}{g^2} c=AB,就是:c=g2ab
那么接下来问题就比较好处理了:
由于 a , b < = 1 0 12 a,b<=10^{12} a,b<=1012,那么 a + b = 2 ∗ 1 0 12 = 1 0 6 级 别 \sqrt{a+b}=\sqrt{2*10^{12}}=10^6级别 a+b =2∗1012 =106级别
我们先枚举gcd(a,b)=g,然后假设a=i*g,那么可以列出和式:
∑ g = 1 2 n ∑ i = 1 ⌊ n g ⌋ [ g c d ( i g , g 2 − i g ) = g ] \sum_{g=1}^{\sqrt{2n}}\sum_{i=1}^{\lfloor{\frac{n}{g}}\rfloor}[gcd(ig,g^2-ig)=g] g=1∑2n i=1∑⌊gn⌋[gcd(ig,g2−ig)=g]
化简一下:
∑ g = 1 2 n ∑ i = 1 ⌊ n g ⌋ [ g c d ( i , g − i ) = 1 ] \sum_{g=1}^{\sqrt{2n}}\sum_{i=1}^{\lfloor{\frac{n}{g}}\rfloor}[gcd(i,g-i)=1] g=1∑2n i=1∑⌊gn⌋[gcd(i,g−i)=1]
由于辗转相减的性质,可知:
∑ g = 1 2 n ∑ i = 1 ⌊ n g ⌋ [ g c d ( i , g ) = 1 ] \sum_{g=1}^{\sqrt{2n}}\sum_{i=1}^{\lfloor{\frac{n}{g}}\rfloor}[gcd(i,g)=1] g=1∑2n i=1∑⌊gn⌋[gcd(i,g)=1]
即是求一定范围内与g互质的数的个数。
前面还有一些小问题,实际上我们对i的限制范围有一些不准确。
1 < = g 2 − i g < = n 1<=g^2-ig<=n 1<=g2−ig<=n
g − ⌊ n g ⌋ < = i < = g − 1 g-\lfloor\frac{n}{g}\rfloor<=i<=g-1 g−⌊gn⌋<=i<=g−1
与原范围合并一下,可以化简为:
m a x ( 1 , g − ⌊ n g ⌋ ) < = i < = m i n ( g − 1 , ⌊ n g ⌋ ) max(1,g-\lfloor\frac{n}{g}\rfloor)<=i<=min(g-1,\lfloor\frac{n}{g}\rfloor) max(1,g−⌊gn⌋)<=i<=min(g−1,⌊gn⌋)
所以原式可以写成:
∑ g = 1 2 n ∑ i = m a x ( 1 , g − ⌊ n g ⌋ ) m i n ( g − 1 , ⌊ n g ⌋ ) [ g c d ( i , g ) = 1 ] \sum_{g=1}^{\sqrt{2n}}\sum_{i=max(1,g-\lfloor\frac{n}{g}\rfloor)}^{min(g-1,\lfloor\frac{n}{g}\rfloor)}[gcd(i,g)=1] g=1∑2n i=max(1,g−⌊gn⌋)∑min(g−1,⌊gn⌋)[gcd(i,g)=1]
接下来只要求 g c d ( i , g ) = 1 gcd(i,g)=1 gcd(i,g)=1的对数了。
这个可以直接用莫比乌斯反演,对r搞一下,l-1搞一下,然后相减即可。
时间复杂度 O ( n l o g ( n ) ) O(\sqrt{n}log(\sqrt{n})) O(n log(n ))
代码如下:
#pragma GCC optimze("Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e6+5;
ll n,ans;
int mu[maxn],su[maxn],lnk[maxn],nxt[16*maxn],son[16*maxn],tot;
bool vis[maxn];
void make_mu(){mu[1]=1; int m=0;for (int i=2;i<=2e6;i++){if (!vis[i]) su[++m]=i,mu[i]=-1;for (int j=1;j<=m&&1ll*su[j]*i<=2e6;j++){vis[i*su[j]]=1;if (i%su[j]==0) {mu[i*su[j]]=0; break;}else mu[i*su[j]]=-mu[i];}}
}
ll doit(ll x,ll y){ll ret=0;for (int j=lnk[y];j;j=nxt[j])if (y%son[j]==0) ret+=mu[son[j]]*(x/son[j]);return ret;
}
void add(int x,int y){son[++tot]=y,nxt[tot]=lnk[x],lnk[x]=tot;
}
int main(){scanf("%lld",&n);make_mu();for (int i=1;1ll*i*i<=2*n;i++)if(mu[i])for (int j=1;1ll*j*i*j*i<=2*n;j++)add(i*j,i);for (ll g=1ll;g*g<=2*n;g++)ans+=doit(min(n/g,g-1),g)-doit(max(1ll,g-n/g)-1,g);printf("%lld\n",ans);return 0;
}
LOJ6482. LJJ 爱数数相关推荐
- 「LOJ6482」LJJ爱数数
「LOJ6482」LJJ爱数数 解题思路 : 打表发现两个数 \(a, b\) 合法的充要条件是(我不管,我就是打表过的): \[ a + b = \text{gcd}(a, b)^2 \] 设 \( ...
- P4844 LJJ爱数数
题目 P4844 LJJ爱数数 本想找到莫比乌斯反演水题练练,结果直接用了两个多小时才做完 做法 \(\sum\limits_{a=1}^n\sum\limits_{b=1}^n\sum\limits ...
- P4844 LJJ爱数数 数论
思路: 化简后得到(a+b)c=ab,设g=(a,b),A=a/g,B=b/g,则g(A+B)c=ABg^2,即(A+B)c=ABg 由题目已知条件:(a,b,c)=1,即(g,c)=1,g|(A+B ...
- 中国石油大学(北京)第三届“骏码杯”程序设计竞赛(同步赛)——C 小菲爱数数
题目链接:C-小菲爱数数_中国石油大学(北京)第三届"骏码杯"程序设计竞赛(同步赛) (nowcoder.com) 思路好像和题解不一样,但是a了. 主要思路:首先肯定是要先把素数 ...
- 华为手机8大超实用功能!省心省力省钱!数数你用过几个
由于种种客观因素,今年好多小伙伴都换了华为手机, 可换了之后,却有好多功能不会用,或者说还从没发现, 那实在是太暴殄天物啦! 本文就用动图来直观演示--那些不为人知的8大超实用功能吧! 涵盖学习工作生 ...
- 数数题(计数类 DP)做题记录
数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当:所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和. 完全图点数为 \(n ...
- NOIP模拟测试29「爬山·学数数·七十和十七」
爬山题解不想写了 学数数 离散化然后找到以每一个值为最大值的连续子段有多少个,然后开个桶维护 那么怎么找以每一个值为最大值的连续子段个数 方法1(我的极笨的方法) 考试时我的丑陋思路, 定义极左值为左 ...
- 「SDOI2014」数数 解题报告
「SDOI2014」数数 题目描述 我们称一个正整数 \(N\) 是幸运数,当且仅当它的十进制表示中不包含数字串集合 \(S\) 中任意一个元素作为其子串. 例如当 \(S=(\)22, 333, 0 ...
- CSDN挑战编程——《金色十月线上编程比赛第一题:小女孩数数》
金色十月线上编程比赛第一题:小女孩数数 题目详情: [金色十月线上编程比赛规则] 一个小女孩正在用左手手指数数,从1数到n.她从拇指算作1开始数起,然后,食指为2,中指为3,无名指为4,小指为5.接下 ...
最新文章
- Linux 的文件权限与目录配置
- 从中间件到分布式数据库生态,ShardingSphere 5.x革新变旧
- C语言技巧之长度为0的数组
- android应用崩溃的调试方法
- jquery 滚动条插件
- python刷b站教程_【Python】【学习资源】B站上的Python学习资源
- 几个用于更精细判断敛散性的级数
- elment-ui的table组件多行合并
- 树莓派 Raspberry-Pi 折腾系列:系统安装及一些必要的配置
- 缠论中枢python源码_缠论中枢主图指标 源码 通达信 贴图 自动画笔
- 计算机管理显示磁盘未知,磁盘未知,未初始化或未分配问题的解决方案
- 应用树莓派GPIO完成智能红绿灯系统
- 【学习笔记】C++STL和泛型编程-侯捷
- sklearn之make_blobs:产生数据集
- Qt编写自定义控件37-发光按钮(会呼吸的痛)
- 如何从网上下载一段视频(iawia002)
- java.security.InvalidKeyException:illegal Key Size 报错解决
- 计算机音乐谱病名为爱,天谕手游病名为爱乐谱代码是什么-天谕手游病名为爱乐谱代码分享_快吧手游...
- Tiva单片机——简易示波器(UART串口屏)
- PMP学员:项目管理的重要性