Description
求\(\varphi(n),n\leqslant 10^{18}\)
Solution
数论+Miller_Rabin+Pollard_rho..
啊qwq...
Code
/**************************************************************
Problem: 4802
User: BeiYu
Language: C++
Result: Accepted
Time:100 ms
Memory:1296 kb
****************************************************************/
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
namespace NT {
inline LL Mul(LL a,LL b,LL p){
if(p<=1000000000) return a*b%p;
return (a*b-(LL)(a/(long double)p*b+1e-3)*p+p)%p;
}
inline LL Pow(LL a,LL b,LL p,LL r=1) { for(;b;b>>=1,a=Mul(a,a,p))
if(b&1) r=Mul(r,a,p);return r; }
int chk(LL a,LL d,LL s,LL p) {
a=Pow(a,d,p),d=a;
for(int i=1;i<=s;i++) {
a=Mul(a,a,p);
if(a==1 && d!=p-1 && d!=1) return 0;
d=a;
}return a==1;
}
int MR(LL p) {
if(p<=1) return 0;
if(p==2) return 1;
if(!(p&1)) return 0;
LL d=p-1,s=0;
for(;!(d&1);d>>=1,s++);
for(int i=0;i<10;i++) if(!chk(rand()%(p-1)+1,d,s,p)) return 0;
return 1;
}
LL gcd(LL a,LL b) { return !b?a:gcd(b,a%b); }
LL Div(LL p,LL c) {
LL x=rand()%p,y=x,t=1;
for(int i=1,k=2;t==1;i++) {
x=(Mul(x,x,p)+c)%p;
t=gcd(abs(x-y),p);
if(i==k) y=x,k<<=1;
}return t;
}
void PR(LL p,vector<LL> &mx) {
if(p==1) return;
if(MR(p)) { mx.push_back(p);return; }
LL tmp=p;
for(;tmp==p;tmp=Div(p,rand()%(p-1)+1));
PR(tmp,mx),PR(p/tmp,mx);
}
}
LL n,ans;
vector<LL> pr;
int main() {
scanf("%lld",&n);
NT::PR(n,pr);
sort(pr.begin(),pr.end());
ans=n;
for(int i=0,j;i<(int)pr.size();i=j+1) {
for(j=i;pr[j+1]==pr[i];j++);
ans/=pr[i];ans*=pr[i]-1;
}printf("%lld\n",ans);
return 0;
}