首页 > 其他分享 >浙江理工大学每日一题——快速幂,线性同余方程,BSGS

浙江理工大学每日一题——快速幂,线性同余方程,BSGS

时间:2023-03-02 19:46:07浏览次数:34  
标签:le 理工大学 ll 样例 yy result return BSGS 同余

题目描述
原题来自:SDOI 2011
你被要求设计一个计算器完成以下三项任务:
给定 y,z,py,z,p,计算 y^x\bmod pyz
modp 的值;
给定 y,z,py,z,p,计算满足 x\times y\equiv z\ (\bmod p\ )x×y≡z (modp ) 的最小非负整数 xx;
给定 y,z,py,z,p,计算满足 y^x\equiv z\ (\bmod p\ )yx≡z (modp ) 的最小非负整数 xx。
输入
输入包含多组数据。
第一行包含两个正整数 T,KT,K 分别表示数据组数和询问类型(对于一个测试点内的所有数据,询问类型相同);
以下 TT 行每行包含三个正整数 y,z,py,z,p,描述一个询问。
输出
对于每个询问,输出一行答案。
对于询问类型 22 和 33,如果不存在满足条件的,则输出 Orz, I cannot find x!,注意逗号与 I 之间有一个空格。
样例输入 Copy
【样例输入1】
3 1
2 1 3
2 2 3
2 3 3
【样例输入2】
3 2
2 1 3
2 2 3
2 3 3
样例输出 Copy
【样例输出1】
2
1
2
【样例输出2】
2
1
0
提示
数据范围与提示
对于全部数据,1\le y,z,p\le 10^9,1\le T\le 101≤y,z,p≤109,1≤T≤10,且保证 pp 为质数。

点击查看代码
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3, "Ofast", "inline")
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll y, z, p;
ll ksm(ll x, ll y, ll mod)
{
    ll result = 1;
    while (y > 0)
    {
        if (y % 2 == 0)
        {
            y = y / 2;
            x = x * x % mod;
        }
        else
        {
            y--;
            result = result * x % mod;
            y = y / 2;
            x = x * x % mod;
        }
    }
    return result;
}
ll exgcd(ll a, ll b, ll &x, ll &yy)
{
    if (b == 0)
    {
        x = 1;
        yy = 0;
        return a;
    }
    ll gcd = exgcd(b, a % b, x, yy);
    ll tmp = x;
    x = yy;
    yy = tmp - a / b * yy;
    return gcd;
}
ll BSGS(ll a, ll b, ll n)
{
    a %= n;
    b %= n;
    if (a == 0)
        return b == 0 ? 1 : -1;
    if (b == 1)
        return 0;
    map<ll, ll> hash;
    ll t = sqrt(n) + 1;
    hash.clear();
    for (int i = 0; i < t; i++)
    {
        ll x = b * ksm(a, i, n) % n;
        hash[x] = i;
    }
    a = ksm(a, t, n);
    for (int i = 1; i <= t; i++)
    {
        ll ans = ksm(a, i, n);
        if (hash[ans])
            return i * t - hash[ans];
    }
    return -1;
}
int main()
{
    int t, k;
    cin >> t >> k;
    while (t--)
    {
        cin >> y >> z >> p;
        if (k == 1)
            cout << ksm(y, z, p) << "\n";
        else if (k == 2)
        {
            ll x, yy;
            ll gcd = exgcd(y, p, x, yy);
            if (z % gcd)
                cout << "Orz, I cannot find x!" << endl;
            else
            {
                x = x * z / gcd;
                x = (x % p + p) % p;
                cout << x << endl;
            }
        }
        else
        {
            ll ans = BSGS(y, z, p);
            if (ans != -1)
                cout << ans << "\n";
            else
                puts("Orz, I cannot find x!");
        }
    }
    system("pause");
    return 0;
}

标签:le,理工大学,ll,样例,yy,result,return,BSGS,同余
From: https://www.cnblogs.com/myy-zzb/p/17173109.html

相关文章

  • 《信息安全数学基础》第一章:整除与同余——知识点梳理
    整除(easy)整除定义若\(\foralla,b\inZ,b\ne0,\existsq\inZ.\s.t.\a=qb.\)则称:\(b\)整除\(a\),或\(a\)被\(b\)整除,记为:\(b\mida\)\(b\)不整除\(a\):\(......
  • 浙江理工大学淘汰赛---猫猫序
    题目描述我们都知道树的dfs序是一棵树从根节点出发,dfs遍历时依次经过的节点序列。现在猫猫有一棵包含n个结点的有根树,结点从1~n编号,1号点为根节点。猫猫想让你告诉它,这......
  • 浙江理工大学2023acm队淘汰赛
    浙江理工大学2023淘汰赛部分题目的理解这里仅提供代码及思路,网站链接如下:链接>http://47.96.116.66/contest.php?cid=5372<难度梯度:ABCLDEFKIGH——/)/)有......
  • 密码学简单数论(3):算术基本定理证明、等价关系、同余和乘法逆元
    参考资料:1.https://www.bilibili.com/video/BV1x3411s7Sy/?spm_id_from=333.788&vd_source=e66dd25b0246f28e772d75f11c80f03c算术基本定理证明  定理2-2(算术基本定......
  • 数论笔记-同余
    目录同余带余数除法带余数除法的定义与基本性质模运算加速算法模运算封装龟速乘快速幂矩阵快速幂同余的定义与基本性质同余类与剩余系的定义与基本性质欧拉函数欧拉函数的......
  • 原根与BSGS
    我是鸽子。$\mathbf{原根}$阶根据欧拉定理,对于\(n\in\mathbbN^*,a\in\mathbbZ\)且\(\gcd(a,n)=1\),有\(a^{\varphi(n)}\equiv1\pmodn\)。此时满......
  • “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛
    A点对最大值对于每个点AC代码:typedefpair<int,int>P;constintN=1e6+10;intn,x;vector<P>G[N];intdp[N];//dp[i]:i子树价值最大链intans;voidadd(intu,......
  • 数论笔记7-一元高次同余方程与多元同余方程
    这里我们先讨论一般情况(但一点也不简单,有很多厉害的定理),二次剩余之后再说.1.一元同余方程的具体解法我们考虑一般的一元同余方程\(f(x)\equiv0\pmodm\),容易......
  • 线性同余方程求解
    对于线性同余方程:$$ax\equivb\pmod{n}$$其中\(a>0,n>0\)进行求解。首先我们可以将其改写为线性不定方程的形式:$$ax+ny=b$$注:以下讨论的方程的解都是整数解......
  • 数论笔记5-同余理论
    温馨提示:这一篇的性质非常多(不过很多性质都比较简单)1.同余若\(m|a-b\),称\(a,b\)模\(m\)同余,\(b\)是\(a\)对模\(m\)的剩余,记作\(a\equivb\pmodm......