转载:Candy? 在线性时间内求出素数与欧拉函数
转载自:http://www.cnblogs.com/candy99/p/6200660.html
2818: Gcd
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 4436 Solved: 1957
[Submit][Status][Discuss]
Description
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.
1<=N<=10^7
uva上做过gcd(x,y)=1的题
gcd(x,y)=p ---> gcd(x/p,y/p)=1
每个质数做一遍行了
答案是欧拉函数的前缀和*2-质数的个数,因为(p,p)算一组
朴素的两个筛法写下来要5000ms
然后就学了一个新技能:欧拉筛法同时求欧拉函数
我们要证明:
若p是x的约数,则Φ(x*p)=Φ(x)*p.
若p不是x的约数,则Φ(x*p)=Φ(x)*(p-1).
欧拉函数是一个积性函数,且phi(p)=p-1 p is prime
若f(n)为数论函数,且f(1)=1,对于互质的正整数p,q有f(p⋅q)=f(p)⋅f(q),则称其为积性函数。
那么Φ(x*p)=Φ(x)*(p-1)
Φ(p^k)=p^k-p^(k-1)=(p-1)*p^(k-1)
证明:
令n=p^k,小于n的正整数数共有n-1即(p^k-1)个,其中不与p互质的数共[p^(k-1)-1]个(除以p然后下取整.....)
所以Φ(p^k)=(p^k-1)-(p^(k-1)-1)=p^k-p^(k-1) 得证。//定义
Φ(p^k)=(p-1)*p^(k-1)=(p-1)*p^(k-2)*p
Φ(p^(k-1))=(p-1)*p^(k-2)
所以当k>1时,Φ(p^k)=Φ(p^(k-1))*p
得证
复习欧拉筛法:对于任意一个合数,拆成最小质数*某个数字的形式,每个数字只会被筛选一次
2016的国家队论文里有一个语言描述比较好,复制不下来....
那么我们遇到一个数i,如果是素数phi[i]=i-1
然后在枚举i*p[j]时,phi[i]已经知道了,由以上两个式子就可以算出phi[i*p[j]]的值了
更一般的来说,就是因为线性筛的过程中得到了每个数的最小质因子,利用了积性函数的性质
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=1e7+;
int n;
bool vis[N];
int p[N],m=;
ll s[N],ans,phi[N];
void sieveprime(){
for(int i=;i<=n;i++){
if(!vis[i]) p[++m]=i;
for(int j=;j<=m&&i*p[j]<=n;j++){
vis[i*p[j]]=;
if(i%p[j]==) break;
}
}
}
void sievephi(){
phi[]=;
for(int i=;i<=n;i++)if(!phi[i]){
for(int j=i;j<=n;j+=i){
if(!phi[j]) phi[j]=j;
phi[j]=phi[j]/i*(i-);
}
}
for(int i=;i<=n;i++) s[i]=s[i-]+phi[i];
}
int main(){
scanf("%d",&n);
sieveprime();
sievephi();
for(int i=;i<=m;i++) ans+=s[n/p[i]];
printf("%lld",ans*-m);
} 朴素
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=1e7+;
int n;
bool vis[N];
int p[N],m=;
ll s[N],ans,phi[N];
void sieve(){
phi[]=;
for(int i=;i<=n;i++){
if(!vis[i]){
p[++m]=i;
phi[i]=i-;
}
for(int j=;j<=m&&i*p[j]<=n;j++){
vis[i*p[j]]=;
if(i%p[j]==){
phi[i*p[j]]=phi[i]*p[j];
break;
}
phi[i*p[j]]=phi[i]*(p[j]-);
}
}
for(int i=;i<=n;i++) s[i]=s[i-]+phi[i];
}
int main(){
scanf("%d",&n);
sieve();
for(int i=;i<=m;i++) ans+=s[n/p[i]];
printf("%lld",ans*-m);
}
转载:Candy? 在线性时间内求出素数与欧拉函数的更多相关文章
- 【算法学习笔记】Meissel-Lehmer 算法 (亚线性时间找出素数个数)
「Meissel-Lehmer 算法」是一种能在亚线性时间复杂度内求出 \(1\sim n\) 内质数个数的一种算法. 在看素数相关论文时发现了这个算法,论文链接:Here. 算法的细节来自 OI w ...
- BZOJ 2818 GCD 素数筛+欧拉函数+前缀和
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1<=x,y<=n且Gcd(x,y)为素数的数对( ...
- 初等数论-Base-1(筛法求素数,欧拉函数,欧几里得算法)
前言 初等数论在OI中应用的基础部分,同机房的AuSquare和zhou2003君早就写完了,一直划水偷懒的Hk-pls表示很方,这才开始了这篇博客. \(P.S.\)可能会分部分发表. Base-1 ...
- (转载)O(N)的素数筛选法和欧拉函数
转自:http://blog.csdn.net/dream_you_to_life/article/details/43883367 作者:Sky丶Memory 1.一个数是否为质数的判定. 质数,只 ...
- 素数的线性筛 && 欧拉函数
O(n) 筛选素数 #include<bits/stdc++.h> using namespace std; const int M = 1e6 + 10 ; int mindiv[M] ...
- 欧拉函数O(sqrt(n))与欧拉线性筛素数O(n)总结
欧拉函数: 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. POJ 2407.Relatives-欧拉函数 代码O(sqrt(n)): ll euler(ll n){ ll ans=n; ...
- poj 2478 Farey Sequence(欧拉函数是基于寻求筛法素数)
http://poj.org/problem?id=2478 求欧拉函数的模板. 初涉欧拉函数,先学一学它主要的性质. 1.欧拉函数是求小于n且和n互质(包含1)的正整数的个数. 记为φ(n). 2. ...
- BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4436 Solved: 1957[Submit][Status][Discuss ...
- 欧拉函数(小于或等于n的数中与n互质的数的数目)&& 欧拉函数线性筛法
[欧拉函数] 在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler’s totient function.φ函数.欧拉商数等. 例如φ( ...
随机推荐
- BZOJ4978: [Lydsy1708月赛]泛化物品(乱搞)
4978: [Lydsy1708月赛]泛化物品 Time Limit: 5 Sec Memory Limit: 256 MBSubmit: 220 Solved: 70[Submit][Statu ...
- C++ 类成员的构造和析构顺序
我想对面向对象有了解的童鞋应该不会对类和对象感到陌生吧 ! 对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象.C++遵循如下的创建顺序: (1)如果某个类具体基类,执行基类 ...
- 找到一篇关于2.4/5G信道的新介绍
关于部分手机无法搜索到5G wifi信号的解决方法第一次在论坛发基础理论贴,希望能普及关于5G wifi的基础知识. 发此贴的原因是基于本人突然发现:MX3刷了3.4.1系统后,搜索不 ...
- 需登录账号与密码的网页爬取demo
public static String connect(String dataUrl){ String result = null; try { HttpClient httpclient = ne ...
- PDF预览之PDFObject.js总结
get from:PDF预览之PDFObject.js总结 PDFObject.js - 将PDF嵌入到一个div内,而不是占据整个页面(要求浏览器支持显示PDF,不支持,可配置PDF.js来实现 ...
- springboot 邮件服务
springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEASE版本了.准备慢慢在写写springboot相关的文章,本篇文章使用springboot最新版本1.5. ...
- Ubuntu中将网卡名称eno16777736改回eth0
一.前言 今天在Vmware Workstation中安装了Ubuntu Server 15.10,然后发现网卡名称出现了问题,主网卡竟然不叫“eth0”,而是叫一个奇怪的名字“eno16777736 ...
- HyberLedger Fabric学习(4)-chaincode学习(操作人员)
参考:http://hyperledger-fabric.readthedocs.io/en/latest/chaincode4noah.html chaincode也能被称作“智能合约”,一般情况下 ...
- node express+mysql搭建简易API服务—body-parser中间件
最近用express搭建了一个简单的RESTful风格的API服务,数据库使用mysql,主要用于获取数据库数据,模糊搜索等. 需要用到的模块: express:这个都很熟悉了: body-parse ...
- 如何量化考核技术人的 KPI?
如何量化考核技术人的 KPI? 原创: 张建飞 阿里技术今天 阿里妹导读:对技术人来说,技术是成长的"核心".然而,在实际工作协作中,技术的重要性常常被业务所掩盖,造成先业务后技术 ...