数论的板子集合……

Description

你被要求设计一个计算器完成以下三项任务:
1、给定y,z,p,计算Y^Z Mod P 的值;
2、给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数;
3、给定y,z,p,计算满足Y^x ≡ Z ( mod P)的最小非负整数。

Input

输入包含多组数据。

第一行包含两个正整数T,K分别表示数据组数和询问类型(对于一个测试点内的所有数据,询问类型相同)。
以下行每行包含三个正整数y,z,p,描述一个询问。

Output

对于每个询问,输出一行答案。对于询问类型2和3,如果不存在满足条件的,则输出“Orz, I cannot find x!”,注意逗号与“I”之间有一个空格。

题目分析

第一个问题:快速幂解决

第二个问题:1.转为exgcd问题   2.直接$x=Z*y^{-1}$

第三个问题:BSGS

BSGS是引入分块的思想解决形如$A^x≡B(mod\,C) C为素数$的问题(至于C不是素数就是exBSGS的范畴了)

具体来说,就是记$size=\sqrt C$,$x=i*size-j \, (0≤j<\sqrt C)$,于是式子就成了$A^{i*size}≡A^j*B$的形式。而右边这个东西是可以预处理出来放在hash表里的,这样在$\sqrt C$枚举$i$的过程中,就可以$O(1)/O(log \, n)$判断是否有相应的j了。

这类思想挺妙的,应该可以迁移到其他地方。

 #include<bits/stdc++.h>
typedef long long ll; int T,k;
ll x,y,p,w,z,d,cir;
std::map<ll, int> mp; ll qmi(ll a, ll b)
{
ll ret = ;
for (a%=p; b; b>>=, a=a*a%p)
if (b&) ret = ret*a%p;
return ret;
}
ll gcd(ll a, ll b){return !b?a:gcd(b, a%b);}
void exgcd(ll a, ll b, ll &x, ll &y)
{
if (!b){
x = , y = ;
return;
}
exgcd(b, a%b, y, x), y -= a/b*x;
}
ll BSGS(ll a, ll b, ll p)
{
if (((!b)&&(!a))) return ;
if ((!a)&&b) return -;
if (b==) return ;
ll size = ceil(sqrt(p)), bse = ;
mp.clear();
for (int i=; i<size; i++)
{
mp[bse*b%p] = i;
bse = bse*a%p;
}
for (ll i=, now=; i<=p; i+=size, now = now*bse%p)
if (mp.count(now)) return ((i-mp[now])%p+p)%p;
return -;
}
int main()
{
for (scanf("%d%d",&T,&k); T; --T)
{
scanf("%lld%lld%lld",&x,&y,&p);
if (k==) printf("%lld\n",qmi(x, y));
if (k==){
x %= p, y %= p;
if (!x) puts("Orz, I cannot find x!");
else printf("%lld\n",y*qmi(x, p-)%p);
}
if (k==){
x %= p, y %= p, d = BSGS(x, y, p);
if (d==-) puts("Orz, I cannot find x!");
else printf("%lld\n",d);
}
}
return ;
}

END

【数学 BSGS】bzoj2242: [SDOI2011]计算器的更多相关文章

  1. BZOJ2242 [SDOI2011]计算器 【BSGS】

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 4741  Solved: 1796 [Submit][Sta ...

  2. [bzoj2242][Sdoi2011]计算器_exgcd_BSGS

    计算器 bzoj-2242 Sdoi-2011 题目大意:裸题,支持快速幂.扩展gcd.拔山盖世 注释:所有数据保证int,10组数据. 想法:裸题,就是注意一下exgcd别敲错... ... 最后, ...

  3. BZOJ2242[SDOI2011]计算器——exgcd+BSGS

    题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p, ...

  4. bzoj2242: [SDOI2011]计算器 BSGS+exgcd

    你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值:(快速幂) 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数:(exgcd) 3.给 ...

  5. bzoj2242: [SDOI2011]计算器 && BSGS 算法

    BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...

  6. 【数论】【快速幂】【扩展欧几里得】【BSGS算法】bzoj2242 [SDOI2011]计算器

    说是BSGS……但是跟前面那题的扩展BSGS其实是一样的……因为模数虽然是质数,但是其可能可以整除a!!所以这两者其实是一样的…… 第一二种操作不赘述. #include<cstdio> ...

  7. bzoj2242 [SDOI2011]计算器——BSGS

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2242 第一次写BSGS,参考了好多好多博客: 然而看到的讲解和模板是一种写法,这道题的网上题 ...

  8. BZOJ2242 [SDOI2011]计算器

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  9. 2018.12.18 bzoj2242: [SDOI2011]计算器(数论)

    传送门 数论基础题. 对于第一种情况用快速幂,第二种用exgcdexgcdexgcd,第三种用bsgsbsgsbsgs 于是自己瞎yyyyyy了一个bsgsbsgsbsgs的板子(不知道是不是数据水了 ...

随机推荐

  1. spring 公用异常处理

    1. 采用spring boot注解方式,如果采用swagger的话会导致swagger不可用 1.1  spring 配置如下 #出现错误时, 直接抛出异常 spring.mvc.throw-exc ...

  2. 牛客假日团队赛2 G.CountyFairEvents

    链接: https://ac.nowcoder.com/acm/contest/924/G 题意: Farmer John has returned to the County Fair so he ...

  3. GYM 101933K(二项式反演、排列组合)

    方法一 设\(f_i\)为最多使用\(i\)种颜色的涂色方案,\(g_i\)为恰好只使用\(i\)种颜色的涂色方案.可知此题答案为\(g_k\). 根据排列组合的知识不难得到\(f_k = \sum_ ...

  4. Codeforces Round #528-A. Right-Left Cipher(字符串模拟)

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  5. tomcat jndi 数据源

    web.xml <!-- ================================================================================ --& ...

  6. 几款常用的高质量web前端框架

    http://blog.csdn.net/qianduankuangjia/article/details/78042944

  7. HttpHelper使用记录

    重新载入页面以获取源代码 var item = new HttpItem() { URL = @"http://www.xxx.com/msg/basic/?a=sendmsg", ...

  8. Java中常见的坑

    概述 Java是门极简风格的语言,比其它语言相比,它故意保持较少的特性,不仅在有些不常见的情况下会出些奇奇怪怪的错误,即使很一般的情况下也有可能让人栽根头.如果你习惯了别的语言,你读Java 的代码很 ...

  9. DialogHelper

    //require ScrollHelper.js function DialogHelper() { var _this = this; var doc = window.document; _th ...

  10. SQL Server事务的四种隔离级别

    在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些是在事务内和事务间可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. 1.未提交读(Read ...