zoukankan      html  css  js  c++  java
  • bzoj 4522

    断了好久的博客了…….似乎我太懒了。qwq。还是要开始写自己的了。

    bzoj的题面好迷,但是我最终是在别人的博客那里看到了清晰的题面。

    第一次写rho,抄了acdreamer的板子。qwq。

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #define rep(i,j,k) for(register int i = j; i <= k; i++)
    #define dow(i,j,k) for(register int i = j; i >= k; i--)
    #define ll long long
    using namespace std;
     
    inline ll read() {
        ll s = 0, t = 1; char c = getchar();
        while( !isdigit(c) ) { if( c == '-' ) t = -1; c = getchar(); }
        while( isdigit(c) ) s = s * 10 + c - 48, c = getchar();
        return s * t;
    }
     
    const int Times = 10;
    inline void M(ll &x,ll p) { if( x >= p ) x -= p; }
     
    inline ll mul(ll a,ll b,ll p) {
        ll ret = 0;
        while( b ) {
            if( b & 1 ) M(ret += a,p);
            M(a += a,p), b >>= 1;
        } return ret;
    }
     
    inline ll pow(ll x,ll t,ll p) {
        ll ret = 1;
        while( t ) {
            if( t & 1 ) ret = mul(ret,x,p);
            x = mul(x,x,p), t >>= 1;
        } return ret;
    } 
     
    int t = 0; ll fac[5];
    inline ll gcd(ll x,ll y) { return !y ? x : gcd(y,x%y); }
    inline ll pollard_rho(ll n,int c) {
        ll i = 1, k = 2, x = rand() % (n-1) + 1, y = x;
        while( 1 ) {
            i++;
            x = (mul(x,x,n) + c) % n;
            ll d = gcd((y - x + n) % n,n);
            if( 1 < d && d < n ) return d;
            if( x == y ) return n;
            if( i == k ) y = x, k <<= 1;
        }
    }
     
    inline bool miller_rabin(ll n) {
        if( n == 2 ) return 1;
        if( n < 2 || !(n & 1) ) return 0;
        ll m = n - 1; int k = 0;
        while( !(m & 1) ) m >>= 1, k++;
        rep(i,1,Times) {
            ll a = rand() % (n-1) + 1;
            ll x = pow(a,m,n), y;
            rep(j,1,k) {
                y = mul(x,x,n);
                if( y == 1 && x != 1 && x != n-1 ) return 0;
                x = y; 
            }
            if( y != 1 ) return 0;
        }
        return 1;
    }
     
    inline void find(ll n,int c) {
        if( n == 1 ) return;
        if( miller_rabin(n) ) {
            fac[t++] = n;
            return;
        }
        ll p = n; int k = c;
        while( p >= n ) p = pollard_rho(n,c--);
        find(p,k), find(n/p,k);
    }
     
    inline void exgcd(ll x,ll y,ll &a,ll &b) {
        if( !y ) a = 1, b = 0; 
        else exgcd(y,x%y,b,a), b -= a * (x / y);
    }
     
    inline ll niyuan(ll x,ll y) {
        ll a, b; exgcd(x,y,a,b);
        return (a % y + y) % y;
    }
     
    int main() {
        ll e = read(), N = read(), c = read();
        find(N,120);
        ll r = ((fac[0] - 1) * (fac[1] - 1)), d = niyuan(e,r), n = pow(c,d,N);
        cout<<d<<" "<<n<<endl;
        return 0;
    }
    
    

      

     

  • 相关阅读:
    java设计模式简介
    java设计模式--单例模式
    判断整形回文数
    常用正则表达式 捕获组(分组)
    [转]十分钟搞定Vue搭建
    ActiveX界面已显示,调用方法报undefined的处理办法
    [转]纯js导出json到excel(支持chrome)
    webapi 开启gzip压缩
    webapi下载文件
    iis添加共享目录为虚拟目录
  • 原文地址:https://www.cnblogs.com/83131yyl/p/6182813.html
Copyright © 2011-2022 走看看