思路:

  因为当n>=1e10的时候,线性筛就不好使啦。所以要用一个公式

  φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn)

  证明详见:《公式证明:欧拉函数》

  Miller-Rabin算法:

    判断某个数是否是素数,不是素数则返回一个因子。

  Pollard-Rho算法:

    利用Miller-Rabin求出 质因数。

    具体的:

      如果当前的数不是质数,找质因数 再搜Rho(n/d)和Rho(d)

      如果是质数(不一定准确),再去判断。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<vector>
#include<map>
#include<string>
#include<iomanip>
#include<iostream>
#include<cmath>
#include<queue>
using namespace std;
#define ALL(x,S) for(x=S.begin();x!=S.end();x++)
typedef long long LL;
typedef long double real;
bool pd_prime[];
set<LL> S;
set<LL>::iterator pos;
LL n;
void prepare()
{
int i,j;
memset(pd_prime,,sizeof pd_prime);
pd_prime[]=;
for(int i=;i<=;i++)
if(pd_prime[i])
for(int j=;j<=/i;j++)
pd_prime[i*j]=;
}
void addp(LL t)
{ S.insert(t);}
LL gcd(LL a,LL b)
{
if(!b) return a;
return gcd(b,a%b);
}
LL mul(LL a,LL b,LL mod)
{
LL ans=;
while(b)
{
if(b&) ans=(ans+a)%mod;
a=(a+a)%mod;
b>>=;
}
return ans;
}
LL pow(LL a,LL b,LL mod)
{
LL ans=;
while(b)
{
if(b&) ans=mul(ans,a,mod);
b>>=;
a=mul(a,a,mod);
}
return ans;
}
bool MR(LL n,LL k)
{
LL s=n-,w=;
while(!(s&))
w++,s>>=;
LL y=pow(k,s,n);
if(y== || y==n-)
return ;
while(w--)
{
y=mul(y,y,n);
if(y==n-)
return ;
}
return ;
}
bool prime(LL n)
{
if(n<=)
return pd_prime[n];
bool flag=;
for(int i=;i<=;i++)
if(pd_prime[i])
if(!MR(n,i)) flag=;
return flag;
}
void rho(LL n)
{
if(n==) return ;
if(n==)
{
addp();
addp();
return ;
}
if(prime(n))
{
addp(n);
return ;
}
LL x,y,d,p;
while()
{
x=,y=,d=;
p=mul(rand(),rand(),);
if(d==)
{
x=(mul(x,x,n)+p)%n;
y=(mul(y,y,n)+p)%n;
y=(mul(y,y,n)+p)%n;
d=gcd(abs(x-y),n);
}
if(d==n) continue;
rho(d);rho(n/d);
return ;
}
}
LL phi(LL x)
{
S.clear();
rho(x);
LL ans=x;
ALL(pos,S)
ans=ans/(*pos)*((*pos)-);
return ans;
}
int main()
{
freopen("phi.in","r",stdin);
freopen("phi.out","w",stdout);
prepare();
scanf("%lld",&n);
cout<<phi(n);
return ;
}

求一个极大数的欧拉函数 phi(i)的更多相关文章

  1. POJ3090 巧用欧拉函数 phi(x)

    POJ3090 给定一个坐标系范围 求不同的整数方向个数 分析: 除了三个特殊方向(y轴方向 x轴方向 (1,1)方向)其他方向的最小向量表示(x,y)必然互质 所以对欧拉函数前N项求和 乘2(关于( ...

  2. hdu 3501 Calculation 2 (欧拉函数)

    题目 题意:求小于n并且 和n不互质的数的总和. 思路:求小于n并且与n互质的数的和为:n*phi[n]/2 . 若a和n互质,n-a必定也和n互质(a<n).也就是说num必定为偶数.其中互质 ...

  3. 筛法求欧拉函数(poj2478

    求1-n的欧拉函数的值 #include <iostream> #include <cstdio> #include <queue> #include <al ...

  4. UVA10200-Prime Time/HDU2161-Primes,例题讲解,牛逼的费马小定理和欧拉函数判素数。

                                                    10200 - Prime Time 此题极坑(本菜太弱),鉴定完毕,9遍过. 题意:很简单的求一个区间 ...

  5. POJ 2480 (约数+欧拉函数)

    题目链接: http://poj.org/problem?id=2480 题目大意:求Σgcd(i,n). 解题思路: 如果i与n互质,gcd(i,n)=1,且总和=欧拉函数phi(n). 如果i与n ...

  6. 数论 - 欧拉函数模板题 --- poj 2407 : Relatives

    Relatives Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11372   Accepted: 5544 Descri ...

  7. 欧拉函数 cojs 2181. 打表

    cojs 2181. 打表 ★☆   输入文件:sendtable.in   输出文件:sendtable.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 有一道比赛题 ...

  8. NOIP模拟:切蛋糕(数学欧拉函数)

    题目描述  BG 有一块细长的蛋糕,长度为 n. 有一些人要来 BG 家里吃蛋糕, BG 把蛋糕切成了若干块(整数长度),然后分给这些人. 为了公平,每个人得到的蛋糕长度和必须相等,且必须是连续的一段 ...

  9. 容斥原理、欧拉函数、phi

    容斥原理: 直接摘用百度词条: 也可表示为 设S为有限集, ,则 两个集合的容斥关系公式:A∪B = A+B - A∩B (∩:重合的部分) 三个集合的容斥关系公式:A∪B∪C = A+B+C - A ...

随机推荐

  1. MySQL_产品昨日库存与历史入库历史出库成本_20161124

    产品昨日库存与历史入库历史出库成本 SELECT d.ID,a.*,e.昨日订单额 ,b.昨天入库额,b.历史2天,b.历史3天,b.历史4天,b.历史5天,b.历史6天,b.历史7天,b.历史8天, ...

  2. BZOJ1146:[CTSC2008]网络管理

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...

  3. openstack实现nova-api的HA

    1       实验环境 Openstack juno版本,一个controller(计算节点也在这个物理节点上)和一个网络节点network 使用haproxy作为代理软件 使用pacemaker作 ...

  4. 希尔排序(java)

    希尔排序是对直接插入排序的一种优化,基本思想是把待排序的数据元素分成若干个小组,对同一小组内的数据元素用直接插入法排序:小组的个数逐次缩小:当完成了所有数据元素都在一个组内的排序后排序过程结束.希尔排 ...

  5. c# link 学习网站

    http://www.cnblogs.com/shanyou/p/4353433.html

  6. STL::next_permutation();

    next_permutation()可以按字典序生成所给区间的全排列. 在STL中,除了next_permutation()外,还有一个函数prev_permutation(),两者都是用来计算排列组 ...

  7. php中替换中文引号不成功的原因

    中文引号替换成英文引号,突然发现总是不成功. 后来查找资料得知,需要写成这种风格的. 正确代码如下:   中文单引号: str_replace('‘',''',$str);str_replace('’ ...

  8. Jdk 1.7*安装并配置

    jdk 1.7的下载,见http://www.cnblogs.com/lchzls/p/6281448.html 新建JAVA_HOME指明JDK安装路径,就是刚才安装时所选择的路径C:\Progra ...

  9. ue4 1官网编程指南总结

    https://docs.unrealengine.com/latest/CHN/index.html 中编程指南 快速入门 actor生命周期 FloatingActor.h #pragma onc ...

  10. 洛谷P4052 [JSOI2007]文本生成器(AC自动机)

    传送门 好像这题的确只能用AC自动机做了……Aufun大佬太强啦 正着难我们反着做,用总共单词个数减去没有一个单词都不包含的 然后考虑怎么处理一个单词都不包含的,就是跑不到单词的结尾节点 定义$f[i ...