【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=4802

【题目大意】

  已知N,求phi(N),N<=10^18

【题解】

  我们用Pollard_Rho对N进行质因数分解,然后计算欧拉函数即可。

【代码】

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#define C 2730
#define S 3
using namespace std;
typedef long long ll;
ll n,m,cnt,cnf,ans;
vector<ll> v;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll mul(ll a,ll b,ll n){return(a*b-(ll)(a/(long double)n*b+1e-3)*n+n)%n;}
ll pow(ll a, ll b, ll n){
ll d=1; a%=n;
while(b){
if(b&1)d=mul(d,a,n);
a=mul(a,a,n);
b>>=1;
}return d;
}
bool check(ll a,ll n){
ll m=n-1,x,y;int i,j=0;
while(!(m&1))m>>=1,j++;
x=pow(a,m,n);
for(i=1;i<=j;x=y,i++){
y=pow(x,2,n);
if((y==1)&&(x!=1)&&(x!=n-1))return 1;
}return y!=1;
}
bool miller_rabin(int times,ll n){
ll a;
if(n==1)return 0;
if(n==2)return 1;
if(!(n&1))return 0;
while(times--)if(check(rand()%(n-1)+1,n))return 0;
return 1;
}
ll pollard_rho(ll n,int c){
ll i=1,k=2,x=rand()%n,y=x,d;
while(1){
i++,x=(mul(x,x,n)+c)%n,d=gcd(y-x,n);
if(d>1&&d<n)return d;
if(y==x)return n;
if(i==k)y=x,k<<=1;
}
}
void findfac(ll n,int c){
if(n==1)return;
if(miller_rabin(S,n)){
v.push_back(n);
return;
}ll m=n;
while(m==n)m=pollard_rho(n,c--);
findfac(m,c),findfac(n/m,c);
}
int main(){
while(~scanf("%lld",&n)){
findfac(n,C);
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
ll phi=n;
for(int i=0;i<v.size();i++){
ll y=v[i];
phi=(phi/y)*(y-1);
}printf("%lld\n",phi);
}return 0;
}

最新文章

  1. SVN 删除误上传到服务器的文件
  2. SQL 行列倒置
  3. java代码和spring框架读取xml和properties文件
  4. Web开发常用知识点 - PHP
  5. pyhton类集成
  6. maven命令大全
  7. HDU4528+BFS
  8. 【42】了解typename的双重意义
  9. 【python】分片copy和等号的区别
  10. rsyslog安装
  11. 核心基础以及Fragment与Activity传递数据完整示例
  12. Java与算法之(6) - 八皇后问题
  13. 自己编写的仿京东移动端的省市联动选择JQuery插件
  14. python中的while循环和for循环
  15. 二、消息队列之如何在C#中使用RabbitMQ
  16. How to make PostgreSQL functions atomic?
  17. MongoDB之$关键字及$修改器$set $inc $push $pull $pop
  18. 307. Range Sum Query - Mutable查询求和的范围(可变)
  19. svn 脚本替换
  20. JS跨页面或跨JS文件对变量赋值

热门文章

  1. flask函数已定义参数却出现takes 0 positional arguments but 1 was given的问题
  2. H5特性 MutationObserver 监听元素 动态改变iframe高度
  3. vue实现微信对话
  4. Windows下基于python3使用word2vec训练中文维基百科语料(一)
  5. ubuntu 提速
  6. 安全测试===黑客攻击常用cmd命令大全
  7. 真正的上锁前,为何要调用preempt_disable()来关闭抢占的case【转】
  8. chain模块将两个列表合并
  9. 深度学习方法:受限玻尔兹曼机RBM(三)模型求解,Gibbs sampling
  10. hdu 1203(01背包)被初始化坑惨了