欧拉筛法(phi,d,prime)
筛法求素数的核心就是让每个合数被它的最小质因子筛掉,那么剩下来的就是素数了。
于是在这个过程中我们可以顺便求出每个数的φ()、d()、e()。
其中上述三个函数均为不完全积性函数(即当x、y互质时才有f(xy)=f(x)f(y)),因此在筛法筛这三个函数时要有分情况讨论。
当x、y不互质时,φ(xy)=φ(x) y,其中y是x最小质因数(即)。由φ的通式可得:φ(xy)=xy(1-1/p1)(1-1/p2)…=xφ(y),所以在用最小素因子筛时就可求了。
当x、y不互质时,由d的通式(上百科自查吧)可得d(xy)=d(x)[e(x)+2]/[e(x)+1]。
当x、y不互质时,若x是y的最小质因数,则e(xy)=e(y)+1。
下面就是代码了——
#include<bits/stdc++.h>
using namespace std;
const int N = ;
int prime[N], e[N], d[N], tot, phi[N];
bool not_p[N];
inline void pre(){
not_p[] = ;
d[] = ;
for(int i = ; i < N; ++i){
if(!not_p[i]) {
++tot, prime[tot] = i;
e[i] = , d[i] = ; phi[i] = i - ;
}
for(int j = ; j <= tot; ++j){
int k = prime[j] * i;
if(k > N) break;
not_p[k] = ;
if(i % prime[j]) {
d[k] = d[i] * d[prime[j]];
e[k] = ;
phi[k] = phi[i] * phi[prime[j]];
}
else{
d[k] = d[i] / (e[i] + ) * (e[i] + );
e[k] = e[i] + ;
phi[k] = phi[i] * prime[j];
break;
}
}
}
}
int main(){
pre();
printf("phi:\n");
for(int i = ; i < N; ++i){
printf("%d\n", phi[i]);
}
printf("d:\n");
for(int i = ; i < N; ++i){
printf("%d\n", d[i]);
}
printf("prime:\n");
for(int i = ; i <= tot; ++i){
printf("%d\n", prime[i]);
}
return ;
}
欧拉筛法(phi,d,prime)的更多相关文章
- 『素数 Prime判定和线性欧拉筛法 The sieve of Euler』
素数(Prime)及判定 定义 素数又称质数,一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数,否则称为合数. 1既不是素数也不是合数. 判定 如何判定一个数是否是素数呢?显然,我 ...
- 【模板】埃拉托色尼筛法 && 欧拉筛法 && 积性函数
埃拉托色尼筛法 朴素算法 1 vis[1]=1; 2 for (int i=2;i<=n;i++) 3 if (!vis[i]) 4 { 5 pri[++tot]=i; 6 for (int j ...
- [洛谷P3383][模板]线性筛素数-欧拉筛法
Description 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) Input&Output Input 第一行包含两个正整数N.M,分别表示查询的 ...
- 素数判断-----埃氏筛法&欧拉筛法
埃氏筛法 /* |埃式筛法| |快速筛选素数| |15-7-26| */ #include <iostream> #include <cstdio> using namespa ...
- 2018牛客网暑期ACM多校训练营(第三场) H - Diff-prime Pairs - [欧拉筛法求素数]
题目链接:https://www.nowcoder.com/acm/contest/141/H 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
- (数论 欧拉筛法)51NOD 1106 质数检测
给出N个正整数,检测每个数是否为质数.如果是,输出"Yes",否则输出"No". Input 第1行:一个数N,表示正整数的数量.(1 <= N &l ...
- 欧拉筛法模板&&P3383 【模板】线性筛素数
我们先来看欧拉筛法 •为什么叫欧拉筛呢?这可能是跟欧拉有关 •但是为什么叫线性筛呢?因为它的复杂度是线性的,也就是O(n),我们直接来看代码 #include<cstdio> #inc ...
- 素数筛总结篇___Eratosthenes筛法和欧拉筛法(*【模板】使用 )
求素数 题目描述 求小于n的所有素数的数量. 输入 多组输入,输入整数n(n<1000000),以0结束. 输出 输出n以内所有素数的个数. 示例输入 10 0 示例输出 4 提示 以这道题目为 ...
- 欧拉函数 &【POJ 2478】欧拉筛法
通式: $\phi(x)=x(1-\frac{1}{p_1})(1-\frac{1}{p_2})(1-\frac{1}{p_3}) \cdots (1-\frac{1}{p_n})$ 若n是质数p的k ...
随机推荐
- 在ASP.NET MVC3 中利用JSONP跨域登录WEB系统
在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复登陆.每次登录都需要输入用户名和密码.最近比较流行的就 ...
- C# 文件读写操作整理
http://www.cnblogs.com/wangshenhe/archive/2012/05/09/2490438.html
- Docker for window 无法共享磁盘
Docker for window 无法共享主机磁盘,环境如下: 操作系统: windown10 Docker version 18.09.0, build 4d60db4 症状如下: 如图,点击ap ...
- STL中的排序算法
本文转自:STL中的排序算法 1. 所有STL sort算法函数的名字列表: 函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 ...
- JavaScript进阶之路 初学者的开始
一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...
- jQuery初始化$(function() { }
$(document).ready(function () { }//没有双引号 $(function() { }
- mysql查询某周的起始日期和终止日期
select subdate(curdate(),date_format(curdate(),'%w')-1) select subdate(curdate(),date_format(curdate ...
- mysql查询某天是本年第几周
SELECT WEEK(date_add('2012-12-31',interval 6 day),2);
- Linux文档编辑 vim
- 国内java,oa,weixin opensource framework www.jeecg.org
Soap/rest 为API生,为框架死,为Debug奋斗一辈子!吃符号的亏,上大小写的当,最后死在需求上!