转载: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.φ函数.欧拉商数等. 例如φ( ...
随机推荐
- linux sort 多列正排序,倒排序
转载:https://segmentfault.com/a/1190000005713784 sort是在Linux里非常常用的一个命令,管排序 sort将文件的每一行作为一个单位,相互比较,比较原则 ...
- graphql 文档 docker 镜像
因为一些原因 graphql 的官方文档无法查看,后者查看不能是方便,所以在官方github 的文档基础上添加了容器构建, 方便进行查看,对于公司内部使用学习会比较好 原理 很简单,openresty ...
- socket编程---TCP
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接.在这时如果有个客户端初始化一个Socket,然后连接服务器(connec ...
- ffmpeg采集帧出错不退出的补丁
在ffmpeg2.81.11和ffmpeg3.0.7上试验.ffmpeg没有FFERROR_REDO常量定义,但ffmpeg3.0.7上有. diff --git a/libavdevice/v4l2 ...
- 现在就开始使用AngularJS的三个重要原因
现在就开始使用AngularJS的三个重要原因 在线演示1 本地下载 如果你不熟悉什么是Angular.js的话,小编我强烈推荐你阅读 Javascript教程:AngularJS的五个超酷特性.简单 ...
- 关于 javascript:void(0) 的问题.
原文地址:楚广明的博客 http://www.cnblogs.com/chu888chu888/archive/2012/01/05/2313045.html 最近看了好几个关于<a>标签 ...
- python 书籍推荐 三
主要先学习<python语言入门>学完后,研究<征服python>Python简明教程(A Byte of Python) 此书讲解简洁易懂,适合初学者 剖析Python源代码 ...
- AHK的OnMessage
OnMessage(0x404, "AHK_NOTIFYICON") AHK_NOTIFYICON(wParam, lParam) { if (lParam = 0x202) ; ...
- 移动自动化测试:Android Studio 、Appium、夜神模拟器
环境是Window 10 64位 第一章:安装Appium Appium和node.js需要一起安装,他们的依赖关系暂不深究. 1. node.js傻瓜式安装 官网地址:https://nodejs. ...
- 简单的TCP代理服务器
我之前的一篇文章(http://www.cnblogs.com/MikeZhang/archive/2012/03/07/socketRedirect.html )中介绍过用python写的一个简单的 ...