#50: Luogu 2485 模板

$des$

1、给定y、z、p,计算y^z mod p 的值;

2、给定y、z、p,计算满足xy ≡z(mod p)的最小非负整数x;

3、给定y、z、p,计算满足y^x ≡z(mod p)的最小非负整数x。

$sol$

模板+模板+模板

#include <bits/stdc++.h>

using namespace std;

#define LL long long

LL n, k;

LL Ksm(LL a, LL b, LL p) {
    LL ret = 1;
    while(b) {
        if(b & 1) ret = ret * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return ret;
}

void Work1() {
    for(int i = 1; i <= n; i ++) {
        LL y, z, p; cin >> y >> z >> p;
        cout << Ksm(y, z, p) << "\n";
    }
}

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, x, y);
    LL tmpx = x; x = y; y = tmpx - a / b * y;
    return g;
}

void Work2() {
    for(int i = 1; i <= n; i ++) {
        LL y, z, p; cin >> y >> z >> p;
        LL x, k;
        LL gcd = Exgcd(y, p, x, k);
        if(z % gcd) {
            puts("Orz, I cannot find x!"); continue;
        }
        LL r = z / gcd, d = p / gcd;
        x *= r;
        x = ((x % d) + d) % d;
        cout << x << "\n";
    }
}

map <LL, int> Map;

void Work3() {
    for(int i = 1; i <= n; i ++) {
        LL y, z, p; cin >> y >> z >> p;
        // y ^ x = z (mod p)
        LL m = sqrt(p);
        if(m * m != p) m ++;
        // y ^ {im} = z * y ^ j (mod p)
        if(!(y % p)) {
            puts("Orz, I cannot find x!"); continue;
        }
        Map.clear();
        Map[z % p] = 0;
        LL ans = z % p;
        for(int i = 1; i <= m; i ++) {
            ans = (ans * y) % p;
            Map[ans] = i;
        }
        LL f = Ksm(y, m, p);
        bool flag = 1;
        ans = 1;
        for(int i = 1; i <= m; i ++) {
            ans = ans * f % p;
            if(Map[ans]) {
                LL O = i * m - Map[ans];
                O = (O % p + p) % p;
                cout << O << "\n";
                flag = 0;
                break;
            }
        }
        if(flag) {
            puts("Orz, I cannot find x!");
        }
    }
} 

int main() {
    cin >> n >> k;
    k == 1 ? Work1() : (k == 2 ? Work2() : Work3());

    return 0;
}

原文地址:https://www.cnblogs.com/shandongs1/p/9917783.html

时间: 2024-10-07 18:24:11

#50: Luogu 2485 模板的相关文章

[luogu P3384] [模板]树链剖分

[luogu P3384] [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和 操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z 操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和 输入输出格式 输入格式: 第一行包含4个正整数

luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)

luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<cstring> #include<iomanip> #include<algorithm> #include<ctime> #include<queue> #inc

Luogu【模板】树状数组

https://www.luogu.org/problemnew/show/P3374 单点修改, 区间查询 1 //2018年2月18日17:58:16 2 #include <iostream> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 500001; 7 int n, m; 8 int a[N], c[N]; 9 10 inline int lowbit(int x){ 11 return x &

[luogu P5325][模板]Min_25筛

Address Luogu #5325 Solution 记 \(p_i\) 表示第 \(i\) 小的质数(\(p[0]=1\)),\(s1[x]=\sum_{i=1}^{x}p[x],s2[x]=\sum_{i=1}^{x}p[x]^2\). 记 \(g1(x,i)\) 为:\[\sum_{j=1}^{x}[j是质数或j的最小质因子大于p_i]j\] 记 \(g2(x,i)\) 为:\[\sum_{j=1}^{x}[j是质数或j的最小质因子大于p_i]j^2\] 因为 \(n\) 以内的合数的

Luogu P3811 [模板]乘法逆元 题解报告

题目传送门 [题目大意] 给定$n$,求$1-n$在膜$p$意义下的乘法逆元. [思路分析] 好的原本我只会求单个数的逆元,然后被告知了这道题之后发现自己不会做(我果然还是太弱了),于是就学了一下递推求逆元. 设$p=k*i+r$,则可得$k*i+r\equiv0(mod\ p)$,然后乘上$i^{-1},r^{-1}$即可得到$k*r^{-1}+i^{-1}\equiv0(mod\ p)$ 由于$k=\lfloor \frac{p}{i}\rfloor,r=p\ mod\ i$,所以$i^{-

[题解] Luogu P4245 [模板]任意模数NTT

三模NTT 不会... 都0202年了,还有人写三模NTT啊... 讲一个好写点的做法吧: 首先取一个阀值\(w\),然后把多项式的每个系数写成\(aw + c(c < w)\)的形式,换句话说把多项式\(f(x)\)写成两个多项式相加的形式: \[ f(x) = wf_0(x) + f_1(x) \] 这样在这道题中取\(W = 2^{15}\)就可以避免爆long long了. 乘起来的话就是 \[ f \cdot g = (w f_0 + f_1)(wg_0 + g_1) = (f_0 g

POJ 1273 Drainage Ditches (网络流Dinic模板)

Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage

函数模板与模板函数

1.函数指针--指针函数  函数指针的重点是指针.表示的是一个指针,它指向的是一个函数,例子: int   (*pf)(); 指针函数的重点是函数.表示的是一个函数,它的返回值是指针.例子: int*   fun(); 2.数组指针--指针数组  数组指针的重点是指针.表示的是一个指针,它指向的是一个数组,例子: int   (*pa)[8]; 指针数组的重点是数组.表示的是一个数组,它包含的元素是指针.例子; int*   ap[8]; 3.类模板--模板类(class   template-

关于模板

模板实例化 程序员在使用模板类最常犯的错误为:将模板类视为某种数据类型.所谓类型参量化这样的术语导致了这种误解.模板当然不是数据类型,模板就是模板. 明确以下观点,帮助理解模板: 编译器使用模板,通过模板参数来创建数据类型,这个过程就是模板实例化: 从模板类创建得到的类型称之为特例: 模板实例化取决于编译器能够找到可用代码来创建特例: 要创建特例,编译器不仅要看到模板的声明,还要看到模板的定义: 模板实例化的过程是迟钝的,即:只能通过函数的定义来实现实例化. 方法一定义模板 // array.h