【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将以如下方式计算优美程度: 首先对于每一段,求出他们的数字和.然后对于每段的和,求 ...
随机推荐
- 微信小程序上传图片(附后端代码)
几乎每个程序都需要用到图片. 在小程序中我们可以通过image组件显示图片. 当然小程序也是可以上传图片的,微信小程序文档也写的很清楚. 上传图片 首先选择图片 通过wx.chooseImage(OB ...
- PHP数组循环遍历的四种方式
1.使用for循环遍历数组 conut($arr);用于统计数组元素的个数. for循环只能用于遍历,纯索引数组!!!! 如果存在关联数组,count统计时会统计两种数组的总 ...
- Scrapy框架Crawler模板爬虫
1.创建一个CrawlerSpider scrapy genspider -t crawl wx_spider 'wxapp-union.com' #导入规则 from scrapy.spiders ...
- Hadoop 单机安装配置
- Docker(六)安装Red5进行rtmp推流
1.pull镜像 docker pull mondain/red5 2.启动原版red5 docker run --name red5 -d -p 5080:5080 -p 1935:1935 mon ...
- 基于PHP的一种Cache回调与自动触发技术
$s = microtime(true); for($i=0; $iaaa($array, $array, $array); $data = a::bbb($array, $array, $array ...
- Django项目:CRM(客户关系管理系统)--31--23PerfectCRM实现King_admin数据删除
登陆密码设置参考 http://www.cnblogs.com/ujq3/p/8553784.html # king_urls.py # ————————02PerfectCRM创建ADMIN页面—— ...
- 【noip】跟着洛谷刷noip题
传送门 1.铺地毯 d1t1 模拟 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> # ...
- SPSS正交设计的操作
SPSS正交设计的操作 设要做二因素的正交设计,A因素有三个水平,B因素有两个水平.则选择Data-->Orthogonal Design-->generate,弹出的就是正交设计窗口: ...
- 使用session实现一次性验证码
在登录页面和各种页面,会看到有验证码输入,这样做的目的是为了防止密码猜测工具破解密码,保护了用户密码安全,验证码只能使用一次,这样就给密码猜测工具带来了很大的困难,基本上阻断了密码猜测工具的使用. 可 ...