zoukankan      html  css  js  c++  java
  • 常用技巧

    扩展欧几里得求逆元

    void exgcd ( int a , int b ) {
        if ( b == 0 ) {
            x = 1; y = 0;
            return ;
        }
        exgcd ( b , a % b );
        int xx , yy;
        xx = y;
        yy = x - (a/b) * y;
        x = xx; y = yy;
    }
    int getinv ( int a , int b ) {
        exgcd ( b , a );
        y %= b;
        if ( y < 0 ) y += b;
        return y;
    }

    快速幂

    ll qpow(ll m, ll k, ll mod)
    {
        ll res = 1, t = m;
        while (k)
        {
            if (k & 1)
                res = res * t % mod;
            t = t * t % mod;
            k >>= 1;
        }
        return res;
    }

    gcd,lcm

    ll gcd(ll m, ll n)
    {
        return n == 0 ? m : gcd(n, m % n);
    }
    ll lcm(ll m, ll n)
    {
        return m * n / gcd(m, n);
    }

    扩展欧几里得求方程

    void exgcd(ll A, ll B, ll& x, ll& y)
    {
        if (B) exgcd(B, A % B, y, x), y -= A / B * x; else x = 1, y = 0;
    }

    欧拉筛

    
    

    vector<int> pri;
    bool vis[N];


    void
    sieve() { for (int i = 2; i < N; i++) { if (!vis[i]) pri.push_back(i); for (int x : pri) { if ((ll)i * x > N) break; vis[i * x] = 1; if (i % x == 0) break; } } }

    判断是否素数

    bool isPrime(int num)
    {
            if (num == 2 || num == 3)
                   return 1;
            if (num % 6 != 1 && num % 6 != 5)
                   return 0;
            int tmp = sqrt(num);
            for (int i = 5; i <= tmp; i += 6)
                   if (num %i == 0 || num % (i + 2) == 0)
                           return 0;
            return 1;
    }

     矩阵乘法+快速幂

    struct matrix 
    {
        double mat[2][2];
    };
    matrix mul(matrix a,matrix b)
    {
        matrix res;
        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                res.mat[i][j] = 0;
                for (int k = 0; k < 2; k++)
                {
                    res.mat[i][j] += a.mat[i][k] * b.mat[k][j];
                    
                }
            }
        }
        return res;
    }
    matrix powm(matrix a, int n)
    {
        matrix res;
        memset(res.mat,0, sizeof(res.mat));
        for (int i = 0; i < 2; i++)
        {
            res.mat[i][i] = 1;
        }
        matrix tmp = a;
        while (n)
        {
            if (n & 1)
                res = mul(res, tmp);
            tmp = mul(tmp, tmp);
            n >>= 1;
        }
        return res;
    }

     map按键值排序 eg.  (放弃map排value的想法!)

    struct cmp
    {
        bool operator() (const pair<string, string> &a , const pair<string, string> &b)
        {
            if (a.second != b.second)
                return a.second < b.second;
            else
                return a.first < b.first;
        }
    };

     Comb

    
    
    inline int add(int x, int y) {
        return ((x % mod) + (y % mod)) % mod;
    }
    inline int sub(int x, int y) {
        x -= y;
        return x < 0 ? x += mod : x;
    }
    inline int mul(int x, int y) {
        return (1ll * (x % mod) * (y % mod)) % mod;
    }
    inline int inv(int x) {
        return qpow(x, mod - 2);
    }
    inline int divd(int x, int y) {
        return (1ll * (x % mod) * inv(y)) % mod;
    }
    
    
    namespace Comb {
            const int maxc = 2000000 + 5;
            int f[maxc], inv[maxc], finv[maxc];
            void init()
            {
                   inv[1] = 1;
                   for (int i = 2; i < maxc; i++)
                           inv[i] = (mod - mod / i) * 1ll * inv[mod % i] % mod;
                   f[0] = finv[0] = 1;
                   for (int i = 1; i < maxc; i++)
                   {
                           f[i] = f[i - 1] * 1ll * i % mod;
                           finv[i] = finv[i - 1] * 1ll * inv[i] % mod;
                   }
            }
            int C(int n, int m)
            {
                   if (m < 0 || m > n) return 0;
                   return f[n] * 1ll * finv[n - m] % mod * finv[m] % mod;
            }
            int S(int n, int m)
            {
                   // x_1 + x_2 + ... + x_n = m, x_i >= 0
                   if (n == 0 && m == 0) return 1;
                   return C(m + n - 1, n - 1);
            }
    }
    using Comb::C;
    int main()
    {
        Comb::init();
    }

     单调队列

    class MonotonicQueue {
    private:
        deque<int> data;
    public:
        void push(int n) {
            while (!data.empty() && data.back() < n) 
                data.pop_back();
            data.push_back(n);
        }
    
        int max() { return data.front(); }
    
        void pop(int n) {
            if (!data.empty() && data.front() == n)
                data.pop_front();
        }
    };

     并查集

    int f[200010];
    int find(int x) {
        return f[x] == x ? x : f[x] = find(f[x]);
    }
    bool add(int x, int y) {
        int fx = find(x), fy = find(y);
        if (fx != fy) {
            f[fx] = fy;
            return true;
        }
        return false;
    }
  • 相关阅读:
    Java在Web开发语言上败给了PHP(转)
    很开心收到了Andreas Loew发给我的注册key
    Cocos2d-x开发移植到安卓平台横竖屏设置及相关
    学习实战二:利用Cocos2d-x写的第一个游戏
    Cocos2d-x项目移植到安卓平台易出现的错误
    cocos2d-x帧动画实现(写下备忘)
    cocos2d-x学习遇到的问题
    C++指针的管理
    Win7开自带的虚拟WIFI
    【SICP练习】21 练习1.27
  • 原文地址:https://www.cnblogs.com/dealer/p/13034785.html
Copyright © 2011-2022 走看看