zoukankan      html  css  js  c++  java
  • [AHOI2005]洗牌(线性同余方程)

    这题的关键在于怎么建模。把已知信息建成数学模型再来解答。


    通过打表或者其他方法找规律得到在位置x通过一次变换得到的位置是$x imes 2$ % $n+1$。

    m次即为$2^{m}x equiv l(mod n+1)$。找到这个线性同余方程的解就是答案。

    直接乘会爆longlong所以要用龟速乘或long double。

    #include <iostream>
    
    #include <cstdio>
    
    typedef long long ll;
    
    using namespace std;
    
    ll n, m, l;
    
    ll exgcd(ll a, ll b, ll &x, ll &y) {
    
        if (b == 0) {
    
            x = 1;
    
            y = 0;
    
            return a;
    
        }
    
        ll g = exgcd(b, a % b, y, x);
    
        y -= a / b * x;
    
        return g;
    
    }
    
    ll mul(ll a, ll b, ll mod) {
    
        ll ret = 0;
    
        while (b) {
    
            if (b & 1) ret = (ret + a) % mod;
    
            a = (a + a) % mod;
    
            b >>= 1;
    
        }
    
        return ret;
    
    }
    
    ll ksm(ll a, ll b, ll mod) {
    
        ll ret = 1;
    
        while (b) {
    
            if (b & 1) ret = mul(ret, a, mod);
    
            a = mul(a, a, mod);
    
            b >>= 1;
    
        }
    
        return ret;
    
    }
    
    
    
    int main() {
    
        ll x0, y0;
    
        cin >> n >> m >> l;
    
        exgcd(ksm(2, m, n + 1), n + 1, x0, y0);
    
        x0 = (x0 % (n + 1) + n + 1) % (n + 1);
    
        x0 = mul(x0, l, n + 1);
    
        cout << x0;
    
        return 0;
    
    }
  • 相关阅读:
    MFC中动态控件的创建与响应
    fseek函数
    fullPage.js插件用法(转发)
    二级联动
    ajax_异步交互-get/post方式
    02_数据类型转换-小结
    01_创建对象的三种方法
    分布式与集群
    FSM
    开发一个第三方库的一般性和团队特定规则
  • 原文地址:https://www.cnblogs.com/zcr-blog/p/13149810.html
Copyright © 2011-2022 走看看