污污污污

2242: [SDOI2011]计算器
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 2312 Solved: 917
[Submit][Status][Discuss]

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”之间有一个空格。

Sample Input
【样例输入1】
3 1
2 1 3
2 2 3
2 3 3

【样例输入2】
3 2
2 1 3
2 2 3
2 3 3

【数据规模和约定】
对于100%的数据,1<=y,z,p<=10^9,为质数,1<=T<=10。
Sample Output

【样例输出1】
2
1
2

【样例输出2】
2
1
0

HINT

Source
第一轮day1

第一问:快速幂直接搞;
第二问:拓展欧几里得直接搞;
第三问:BSGS直接搞;

安利一下BSGS的大体框架:
首先要求 a^x=b (mod c)
假定x=im-j (m=ceil(sqrt(n)))
那么进行变换:
a^im = b*a^j (mod c)
枚举b*a^j mod p的值存入哈希表(map)。
再枚举a^im的值,从哈希表里找,如果能找到一样的答案就是i*m-j

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>using namespace std;
int n;int read()
{int x=0,f=1; char ch=getchar();while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}return x*f;
}int gcd(int a,int b)
{if (!b) return a;else return gcd(b,a%b);
}void exgcd(int a,int b,int &x,int &y)
{if (!b) {x=1,y=0;return;}exgcd(b,a%b,x,y);int t=x;x=y;y=t-a/b*y;
}long long quick_pow(long long a,int b,int p)//返回a^b%p的值
{long long re=1;long long tmp=a%p;while (b){if (b&1)re=(re*tmp)%p;tmp=(tmp*tmp)%p;b=b>>1;}return re;
}void work1(int a,int b,int c)
{printf("%lld\n",quick_pow(a,b,c));
}
void work2(int a,int b,int c)
{ c=-c;int gc=gcd(a,c); if (b%gc!=0) {puts("Orz, I cannot find x!");return;}a/=gc;b/=gc;c/=gc;int x,y;exgcd(a,c,x,y);x=(long long)x*b%c;while (x<0) x+=c;printf("%d\n",x);
}
void work3(int a,int b,int c)
{map<int,int>mp;mp.clear();if (a%c==0) {puts("Orz, I cannot find x!");return;}int m=ceil(sqrt(c));long long t=b;for (int i=0; i<=m; i++){mp[(int)t]=i;t=t*a%c;}int s=quick_pow(a,m,c);t=s;for (int i=1; i<=m; i++){int v=mp[(int)t];if (v!=0) {printf("%d\n",i*m-v);return;}t=t*s%c; }puts("Orz, I cannot find x!");
}int main()
{int t=read(),k=read();for (int i=1; i<=t; i++){int y=read(),z=read(),p=read();if (k==1) work1(y,z,p);if (k==2) work2(y,z,p);if (k==3) work3(y,z,p);}return 0;
}

BZOJ-2242 计算器 快速幂+拓展欧几里得+BSGS(数论三合一)相关推荐

  1. bzoj 1477 青蛙的约会 拓展欧几里得(详细解析)

    大水题: 题目戳这里:http://www.lydsy.com/JudgeOnline/problem.php?id=1477 这道题我们分析在一个数轴上有两只青蛙,这个数轴是首尾交接的,所以可以一直 ...

  2. 拓展欧几里得+例题~

    扩展欧几里德算法: 应用: ①求解不定方程 ②求解同余方程 ③求解模的逆元 看欧拉定理看吐了也还是有超级~~多的题目不会做,看的有晕又困!难受,看会别的压压惊~~希望拓展欧几里德的题目能对我稍稍稍稍稍 ...

  3. poj1061-青蛙的约会(拓展欧几里得java)

    题目: 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚 ...

  4. 拓展欧几里得模板/求逆元模板(java)

    拓展欧几里得模板 参考:哈尔滨理工大学ACM培训资料汇编/ACM-ICPC培训资料汇编* 基本原理 :设 a 和 b 不全为 0,则存在整数 x,y 使得 xa yb=gcd(a,b)=c 对于辗转相 ...

  5. 杭电2669拓展欧几里得

    杭电2669 给a,b求Xa Yb = 1.如果没有则输出sorry. 可以通过拓展欧几里得指导Xa Yb = gcd(a,b). 不言而喻要判断gcd(a,b)是否等于1.如果不等于1,那么就是so ...

  6. A/B HDU - 1576 (逆元或拓展欧几里得或数学公式)多解法求大数结果

    题意:求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). 思维:(1)逆元+扩展欧几里得算法:满足a*k≡1 (mo ...

  7. 拓展欧几里得小结(初级理解)

    什么是拓展欧几里得?简单的说,就是求关于x,y的方程 ax + by = gcd(a,b) 的所有整数解 现在我们令g = gcd(a,b)则方程变成了ax + by = g 假如我们现在知道了关于这 ...

  8. 拓展欧几里得 [Noi2002]Savage

    对于一个野人,他(她?)所在的位置,(C[i]+x*p[i])%ans,是的,暴力枚举每一个ans,用拓展欧几里得求出每两个wildpeople(wildrage?)相遇的年份,如果小于最小的寿限(就 ...

  9. AcWing 878. 线性同余方程(拓展欧几里得)

    题目链接 https://www.acwing.com/problem/content/880/ 思路 ai×xi≡bi(modmi)a_i\times x_i≡b_i(mod \ m_i)ai​×x ...

  10. 数学--数论--欧几里得定理和拓展欧几里得定理

    欧几里得定理: gcd(a, b) = gcd(b, a%b) 证明: 我们首先约定:m = gcd(a,b) , n = gcd(b, q) , a = b*p +q.(这里的gcd含义跟上面一样, ...

最新文章

  1. 李彦宏:从没觉得百度模仿谷歌;马化腾:做ICO数字货币有很多风险
  2. CriminalIntent项目开发--后篇
  3. Android 4.1最终版SDK和ADT Plugin全线发布
  4. Python 自带的 any() 函数--判断给定的可迭代参数 iterable 是否全部为 False
  5. vant部署_记录mpvue+vant-weapp的使用(一):安装配置使用,引入vant-weapp
  6. 首次使用Gradle配置本地仓库和更好国内镜像源
  7. STLink MID Keli Debug下载程序时候出现cannot access target shutting down debug session的解决
  8. 《软件工程与实践》第三版 软工导论知识梳理总结
  9. matlab安装mosek工具包
  10. 7种个人主页简历网页模板源码下载
  11. 8K HDR!|为 Chromium 实现 HEVC 硬解 - 原理/实测指南
  12. Power BI DAX: FILTER函数使用多个条件筛选数据
  13. [noip2011]铺地毯(carpet)解题报告
  14. Linux电源管理(五)thermal
  15. PAT 7-14 电话聊天狂人
  16. Zookeeper客户端Curator使用
  17. 捕获了一只发生概率小于万分之一的Bug
  18. MDN的HTML入门,关于MDN,HTML入门来自MDN文档
  19. HADOOP集群大数据词频统计及设计比较(完整教程)
  20. 亚马逊重组游戏开发部门:数个未发布游戏被“扼杀”;台积电明年开始为苹果iPhone生产5nm处理器……...

热门文章

  1. 计算机等级考试:IE地址栏不见了 怎么让消失了的IE地址栏神奇的再次出现。?
  2. CF949D Curfew solution
  3. 进展:Pegasus的自动化编译测试
  4. 打印机能两个计算机共用吗,打印机共享线_两台电脑用一台打印机_分线器可以接打印机吗...
  5. mybatis-动态sql动态bean实例
  6. 读书笔记: 与爱因斯坦月球漫步-记忆术
  7. 华为手机如何设置主页面_华为手机怎么进行桌面管理?正确管理华为手机桌面图标及屏幕的方法...
  8. 无法使用内置管理员账户打开照片,请使用其他账户登录,然后再试一次
  9. 为您详解在ChemDraw中进行3D建模的方法
  10. JZOJ 5442 荒诞