2242: [SDOI2011]计算器

Time Limit: 10 Sec  Memory Limit: 512 MB
[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
思路:1:裸快速幂;
   2:y*x+p*k=z,解方程;
   3:BSGS
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pi (4*atan(1.0))
#define eps 1e-14
const int N=2e5+,M=4e6+,inf=1e9+,mod=1e9+;
const ll INF=1e18+;
#define MOD 100000
int hs[MOD],head[MOD],nex[MOD],id[MOD];
int top;
void Insert(int x,int y)
{
int k = x%MOD;
hs[top] = x, id[top] = y, nex[top] = head[k], head[k] = top++;
}
int Find(int x)
{
int k = x%MOD;
for(int i = head[k]; i; i = nex[i]) if(hs[i] == x) return id[i];
return -;
}
int BSGS(int a,int b,int n)
{
a%=n;
if(!a&&!b){return ;}
if(!a){return -;}
memset(head,,sizeof(head));
top = ;
if(b == )return ;
int m = sqrt(n*1.0), j;
long long x = , p = ;
for(int i = ; i < m; ++i, p = p*a%n)Insert(p*b%n,i);
for(long long i = m; ; i += m)
{
if( (j = Find(x = x*p%n)) != - )return i-j;
if(i > n)break;
}
return -;
}
int exgcd(int a,int b,int &x,int &y)
{
if(b==)
{
x=;y=;
return a;
}
int r=exgcd(b,a%b,x,y);
int t=x;x=y;y=t-a/b*y;
return r;
}
int quick(ll x,int y,int mod)
{
ll ans=;
while(y)
{
if(y&)ans=ans*x,ans%=mod;
x*=x;
x%=mod;
y>>=;
}
return ans;
}
int main()
{
int T,k;
scanf("%d%d",&T,&k);
while(T--)
{
int a,b,n;
scanf("%d%d%d",&a,&b,&n);
if(k==)
printf("%d\n",quick(1LL*a,b,n));
else if(k==)
{
int x,y;
int gcd=exgcd(a,n,x,y);
x=(x%n+n)%n;
if(b%gcd!=)
printf("Orz, I cannot find x!\n");
else
printf("%lld\n",(1LL*x*(b/gcd))%n);
}
else
{
int ans=BSGS(a,b,n);
if(ans==-)
printf("Orz, I cannot find x!\n");
else
printf("%d\n",ans%mod);
}
}
return ;
}

bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德的更多相关文章

  1. BZOJ 2242 [SDOI2011]计算器 BSGS+高速幂+EXGCD

    题意:id=2242">链接 方法: BSGS+高速幂+EXGCD 解析: BSGS- 题解同上.. 代码: #include <cmath> #include <c ...

  2. BZOJ 2242 [SDOI2011]计算器(快速幂+Exgcd+BSGS)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2242 [题目大意] 给出T和K 对于K=1,计算 Y^Z Mod P 的值 对于K=2 ...

  3. BZOJ 2242 [SDOI2011]计算器 ——EXGCD/快速幂/BSGS

    三合一的题目. exgcd不解释,快速幂不解释. BSGS采用了一种不用写EXGCD的方法,写起来感觉好了很多. 比较坑,没给BSGS的样例(LAJI) #include <map> #i ...

  4. BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS

    BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS 题意: 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p, ...

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

    [bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...

  6. bzoj 2242 [SDOI2011]计算器——BSGS模板

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2242 第一道BSGS! 咳咳,我到底改了些什么?…… 感觉和自己的第一版写的差不多……可能是 ...

  7. BZOJ 2242 [SDOI2011]计算器 | BSGS

    insert的时候忘了取模了-- #include <cstdio> #include <cmath> #include <cstring> #include &l ...

  8. bzoj 2242: [SDOI2011]计算器 & BSGS算法笔记

    这题的主要难点在于第三问该如何解决 于是就要知道BSGS是怎样的一种方法了 首先BSGS是meet in the middle的一种(戳下面看) http://m.blog.csdn.net/blog ...

  9. BZOJ 2242: [SDOI2011]计算器( 快速幂 + 扩展欧几里德 + BSGS )

    没什么好说的... --------------------------------------------------------------------- #include<cstdio&g ...

随机推荐

  1. 160926、Java-SpringMVC统一异常处理

    从零开始学 Java - Spring MVC 统一异常处理 看到 Exception 这个单词都心慌 如果有一天你发现好久没有看到Exception这个单词了,那你会不会想念她?我是不会的.她如女孩 ...

  2. MEANIO

    sudo npm install -g bower sudo npm install -g meanio sudo bower cache clean --allow-root sudo mean i ...

  3. 9、Http回顾/Servlet

    1 Http回顾 Http协议: 1)http协议: 对浏览器客户端和服务器端之间数据传输的格式规范. 2)http请求:浏览器->服务器端 格式: 请求行(请求方式(GET/POST) 请求资 ...

  4. 每日一九度之 题目1039:Zero-complexity Transposition

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3372 解决:1392 题目描述: You are given a sequence of integer numbers. Zero-co ...

  5. Humble Numbers

    Humble Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9988 Accepted: 4665 Descri ...

  6. Sqlite查询时间段内的数据问题解决!

    最近搞Sqlite本地查询,需求为查询某时间段内的数据,在SQL中我们都知道为: select * from tblName where rDate Between '2008-6-10' and   ...

  7. select resharper shortcuts scheme

    VS代码生成工具ReSharper提供了丰富的快捷键,可以极大地提高你的开发效率.安装ReSharper后首次启动Visual Studio时,会出现一个名为ReSharper Keyboard Sc ...

  8. range函数

    th> a=torch.range(,) [.0001s] th> a [torch.DoubleTensor of size ] [.0002s] th> a=torch.rang ...

  9. Android内存Context泄露:Handler&内部类

    1 public class SampleActivity extends Activity { 2 3 private final Handler mLeakyHandler = new Handl ...

  10. spark1.4

    spark1.4 Windows local调试环境搭建总结 1.scala版本 scala-2.10.4 官方推荐 scala-2.11.7[不推荐,非sbt项目.需要后加载] 2.spark版本 ...