【JZOJ4919】【NOIP2017提高组模拟12.10】神炎皇
题目描述
神炎皇乌利亚很喜欢数对,他想找到神奇的数对。
对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对。请问这样的数对共有多少呢?
数据范围
对于100%的数据n<=100000000000000。
=w=
引理一
两个互质的数之差与这两个数互质。
证明:
证明依赖于欧几里得算法的gcd(a,b)=gcd(b,a−b)。
1.设a>b,r=(a,b),则有r|a,r|b,表示成a=a′∗r,b=b′∗r。
则有(b,a−b)=(b′∗r,(a′−b′)∗r),显然(b,a−b)也有r这个公约数。
2.设r=(a,b),则有r|a,r|b,表示成a=a′∗r,b=b′∗r。
则有(a+b,a)=((a′+b′)∗r,a′∗r),显然(a+b,a)也有r这个公约数。
综合1,2,(a,b)的公约数也是(b,a−b)的公约数,所以gcd(a,b)=gcd(b,a−b)。
回到原命题,gcd(p,q)=1⇒gcd(q,p−q)=1。
引理二
两个互质的数的和与积互质。
证明:
设gcd(p,q)=1,
根据引理一,则有
gcd(p+q,q)=gcd(q,p)=1,gcd(p+q,p)=gcd(p,q)=1
也就是说(p+q)与p和q都互质,必然就和pq互质。
正文
若(a,b)合法,那么存在(a+b)|ab
设d=gcd(a,b),并且a′∗d=a,b′∗d=b。
那么就有(a′+b′)d|a′b′d2,即(a′+b′)|a′b′d。
根据引理二,又a′与b′互质,则(a′+b′)|d。
题设有a+b<=n,那么(a′+b′)d<=n。
由(a′+b′)|d,d至少为(a′+b′)。
又(a′+b′)d<=n,那么(a′+b′)<=n√。
不妨枚举i=(a′+b′),这样d就只能取n/i个了,每隔i个有一个d|i。
所以合法的d就有n/i2个。
再来考虑符合(a′+b′)=i的个数,由引理一:
如果存在一个gcd(c,i)=1,那么必然存在一个gcd(c,i−c)=1。
于是乎,(a′+b′)=i的个数即为φ(i),可用线性筛法预处理。
综上,ans=∑n√i=2ni2∗φ(i)。
时间复杂度为O(n√)。
代码
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;
const char* fin="uria.in";
const char* fout="uria.out";
const int inf=0x7fffffff;
const int maxn=10000007;
ll n,i,j,k,nq;
ll ans;
ll p[maxn],phi[maxn];
bool bz[maxn];
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%lld",&n);
nq=(ll)sqrt(n);
for (i=2;i<=nq;i++){
if (bz[i]==false){
phi[i]=i-1;
p[++p[0]]=i;
ans+=phi[i]*(n/i/i);
}
for (j=1;j<=p[0];j++){
k=i*p[j];
if (k>nq) break ;
if (i%p[j]==0) phi[k]=phi[i]*p[j];
else phi[k]=phi[i]*(p[j]-1);
bz[k]=true;
ans+=phi[k]*(n/k/k);
if (i%p[j]==0) break;
}
}
printf("%lld\n",ans);
return 0;
}
=o=
线性筛法求欧拉函数
首先有通式,
φ(p1k1∗p2k2∗...∗pnkn)=(p1−1)∗p1k1−1∗(p2−1)∗p2k2−1∗...∗(pn−1)∗pnkn−1。
显然用线筛通过简单转移可以得到。
~
一开始我也考虑分析这个东西,
(a,b)合法就有(a′+b′)|a′b′d。
然后就不会了。
并没有考虑到gcd(a′+b′,a′b′)=1这个性质。
日后这种数论计数问题,先从合法的开始分析。
如果涉及倍数关系,可以考虑排除一些不作贡献的干扰项。
【JZOJ4919】【NOIP2017提高组模拟12.10】神炎皇的更多相关文章
- 【NOIP2017提高组模拟12.10】幻魔皇
题目 幻魔皇拉比艾尔很喜欢斐波那契树,他想找到神奇的节点对. 所谓斐波那契树,根是一个白色节点,每个白色节点都有一个黑色节点儿子,而每个黑色节点则有一个白色和一个黑色节点儿子.神奇的节点对则是指白色节 ...
- 【JZOJ4921】【NOIP2017提高组模拟12.10】幻魔皇
题目描述 幻魔皇拉比艾尔很喜欢斐波那契树,他想找到神奇的节点对. 所谓斐波那契树,根是一个白色节点,每个白色节点都有一个黑色节点儿子,而每个黑色节点则有一个白色和一个黑色节点儿子.神奇的节点对则是指白 ...
- 【NOIP2017提高组模拟12.10】神炎皇
题目 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 分析 设\(gcd(a,b)= ...
- 【JZOJ4920】【NOIP2017提高组模拟12.10】降雷皇
题目描述 降雷皇哈蒙很喜欢雷电,他想找到神奇的电光. 哈蒙有n条导线排成一排,每条导线有一个电阻值,神奇的电光只能从一根导线传到电阻比它大的上面,而且必须从左边向右传导,当然导线不必是连续的. 哈蒙想 ...
- NOIP2017提高组模拟赛 10 (总结)
NOIP2017提高组模拟赛 10 (总结) 第一题 机密信息 FJ有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的 ...
- 【NOIP2017提高组模拟12.24】B
题目 现在你有N个数,分别为A1,A2,-,AN,现在有M组询问需要你回答.每个询问将会给你一个L和R(L<=R),保证Max{Ai}-Min{Ai}<=R-L,你需要找出并输出最小的K( ...
- 求hack or 证明(【JZOJ 4923】 【NOIP2017提高组模拟12.17】巧克力狂欢)
前言 本人在此题有一种不是题解的方法,但无法证明也找不到反例. 如果各位大神有反例或证明请发至 邮箱:qq1350742779@163.com Description Alice和Bob有一棵树(无根 ...
- 【JZOJ4928】【NOIP2017提高组模拟12.18】A
题目描述 数据范围 对于100%的数据,n<=100000,1<=A[i]<=5000 =w= Ans=∏1ai 代码 #include<iostream> #inclu ...
- 【NOIP2017提高组模拟12.17】环
题目 小A有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字.对于一个切分方案,小A将以如下方式计算优美程度: 首先对于每一段,求出他们的数字和.然后对于每段的和,求 ...
随机推荐
- 【codeforces 507E】Breaking Good
[题目链接]:https://vjudge.net/contest/164884#problem/D [题意] 给你一张图; 图中有些路是完好的;但有些路还没修好; 先不管路有没有修好; 问你从起点到 ...
- day21 作业
1.定义MySQL类 1.对象有id.host.port三个属性 2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一 3.提供两种实例化方式,方式一:用户传入host和po ...
- Django项目:CRM(客户关系管理系统)--56--47PerfectCRM实现CRM客户报名流程01
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- ajax发送验证码
$.ajax({ url:url, type:"POST", data:data, dataType:"JSON", s ...
- light oj 1105 规律
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...
- git commit规范工具
npm install -g commitizen commitizen init cz-conventional-changelog --save --save-exact 以后,凡是用到git c ...
- PAT甲级——A1051 Pop Sequence
Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and p ...
- PAT甲级——A1018 Public Bike Management
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- DLL编程总结
进行DLL的编程主要涉及到两个方面的问题,一个是要保证DLL中要导出的函数名不被编译器不可控地更改(在C++中由于重载机制的存在,会造成程序被编译时函数名被改变),其实就是要保证DLL导出的函数名与使 ...
- 探索SpringBoot中的SpringMVC
spring boot就是一个大框架里面包含了许许多多的东西,其中spring就是最核心的内容之一,当然就包含spring mvc.spring mvc 是只是spring 处理web层请求的一个模块 ...