2 条题解

  • 0
    @ 2025-10-8 17:11:25
    #include <bits/stdc++.h>
    using namespace std;
    #define int128 __int128
    
    long long quick_pow(long long a, long long b, long long mod) {
        long long ans = 1;
        while (b) {
            if (b & 1)
                ans = (int128)ans * a % mod;
            a = (int128)a * a % mod;
            b >>= 1;
        }
        return ans;
    }
    
    long long max_factor, n;
    
    bool Miller_Rabin(long long p) {
        if (p < 2) return 0;
        if (p == 2 || p == 3) return 1;
        long long d = p - 1, r = 0;
        while (d % 2 == 0) {
            r++;
            d >>= 1;
        }
        for (long long k = 0; k < 10; k++) {
            long long a = rand() % (p - 2) + 2;
            long long x = quick_pow(a, d, p);
            if (x == 1 || x == p - 1) continue;
            bool ok = 0;
            for (int i = 0; i < r - 1; i++) {
                x = (int128)x * x % p;
                if (x == p - 1) {
                    ok = 1;
                    break;
                }
            }
            if (!ok) return 0;
        }
        return 1;
    }
    
    long long f(long long x, long long c, long long n) {
        return ((int128)x * x + c) % n;
    }
    
    long long Pollard_Rho(long long n) {
        long long s = 0, t = 0;
        long long c = rand() % (n - 1) + 1;
        int step = 0, goal = 1;
        long long val = 1;
        for (goal = 1;; goal <<= 1, s = t, val = 1) {
            for (step = 1; step <= goal; step++) {
                t = f(t, c, n);
                val = (int128)val * abs(t - s) % n;
                if (step % 127 == 0) {
                    long long d = __gcd(val, n);
                    if (d > 1) return d;
                }
            }
            long long d = __gcd(val, n);
            if (d > 1) return d;
        }
    }
    
    long long factor[300010];
    int cnt;
    
    void fac(long long x) {
        if (x <= max_factor || x < 2) return;
        if (Miller_Rabin(x)) {
            factor[++cnt] = x;
            return;
        }
        long long p = x;
        while (p >= x) p = Pollard_Rho(x);
        while (x % p == 0) x /= p;
        fac(x); fac(p);
    }
    
    int main() {
        int T = 1;
        // cin >> T;
        while (T--) {
            srand((unsigned)time(NULL));
            max_factor = 0;
            scanf("%lld", &n);
            fac(n);
            sort(factor + 1, factor + 1 + cnt);
            cnt = unique(factor + 1, factor + 1 + cnt) - factor - 1;
            long long ans = n;
            for (int i = 1; i <= cnt; i++)
                ans = ans / factor[i] * (factor[i] - 1);
            cout << ans << endl;
        }
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:11:18
      #include<bits/stdc++.h>
      using namespace std;
      #define int128 __int128
      long long quick_pow(long long a,long long b,long long mod)
      {
          long long ans=1;
          while(b)
          {
              if(b&1)
                  ans=(int128)ans*a%mod;
              a=(int128)a*a%mod;
              b>>=1;
          }
          return ans;
      }
      long long max_factor,n;
      bool Miller_Rabin(long long p)
      {
          if(p<2)
              return 0;
          if(p==2)
              return 1;
          if(p==3)
              return 1;
          long long d=p-1,r=0;
          while(d%2==0)
          {
              r++;
              d>>=1;
          }
          for(long long k=0;k<10;k++)
          {
              long long a=rand()%(p-2)+2;
              long long x=quick_pow(a,d,p);
              if(x==1||x==p-1)
                  continue;
              for(int i=0;i<r-1;i++)
              {
                  x=(int128)x*x%p;
                  if(x==p-1)
                      break;
              }
              if(x!=p-1)
                  return 0;
          }
          return 1;
      }
      long long f(long long x,long long c,long long n)
      {
          return ((int128)x*x+c)%n;
      }
      long long Pollard_Rho(long long n)
      {
          long long s=0,t=0;
          long long c=rand()%(n-1)+1;
          int step=0,goal=1;
          long long val=1;
          for(goal=1; ;goal<<=1,s=t,val=1)
          {
              for(step=1;step<=goal;step++)
              {
                  t=f(t,c,n);
                  val=(int128)val*abs(t-s)%n;
                  if(step%127==0)
                  {
                      long long d=__gcd(val,n);
                      if(d>1)
                          return d;
                  }
              }
              long long d=__gcd(val,n);
              if(d>1)
                  return d;
          }
      }
      long long factor[300010];
      int cnt;
      void fac(long long x)
      {
          if(x<=max_factor||x<2)
              return ;
          if(Miller_Rabin(x))
          {
              factor[++cnt]=x;
              //max_factor=max(max_factor,x);
              return ;
          }
          long long p=x;
          while(p>=x)
              p=Pollard_Rho(x);
          while(x%p==0)
              x=x/p;
          fac(x);fac(p);
      }
      int main()
      {
          int T=1;
          //cin>>T;
          while(T--)
          {
              srand((unsigned)time(NULL));
              max_factor=0;
              scanf("%lld",&n);
              fac(n);
              sort(factor+1,factor+1+cnt);
              cnt=unique(factor+1,factor+1+cnt)-factor-1;
              long long ans=n;
              for(int i=1;i<=cnt;i++)
                  ans=ans/factor[i]*(factor[i]-1);
              cout<<ans<<endl;
              /*if(max_factor==n)
                  puts("Prime");
              else
                  printf("%lld\n",max_factor);
               */
          }
          return 0;
      }
      
      • 1

      *【Pollard-Rho算法模板】欧拉函数(未)

      信息

      ID
      6471
      时间
      1000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      4
      已通过
      2
      上传者