博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P2485 [SDOI2011]计算器 解题报告
阅读量:5026 次
发布时间:2019-06-12

本文共 1622 字,大约阅读时间需要 5 分钟。

P2485 [SDOI2011]计算器

题目描述

你被要求设计一个计算器完成以下三项任务:

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。

为了拿到奖品,全力以赴吧!

输入输出格式

输入格式:

输入文件calc.in 包含多组数据。

第一行包含两个正整数T、K,分别表示数据组数和询问类型(对于一个测试点内的所有数

据,询问类型相同)。

以下T 行每行包含三个正整数y、z、p,描述一个询问。

输出格式:

输出文件calc.out 包括T 行.

对于每个询问,输出一行答案。

对于询问类型2 和3,如果不存在满足条件的,则输出“Orz, I cannot find x!”。

说明:

1394419-20180911145609201-1822797004.png


T1快速幂

T2逆元orexgcd

无解看看y可不可以整除p

T3 bsgs

从算法竞赛进阶指南上学习的,注意点写了注释


Code:

#include 
#include
#include
#define ll long longll quickpow(ll d,ll k,ll p){ ll f=1; while(k) { if(k&1) f=f*d%p; d=d*d%p; k>>=1; } return f;}ll work1(ll y,ll z,ll p){ return quickpow(y,z,p);}ll work2(ll y,ll z,ll p)//xy=z mod p{ if(y%p==0&&z!=0) return -1; return z*quickpow(y,p-2,p)%p;}std::map
Hash;ll work3(ll y,ll z,ll p)//y^x=z mod p{ Hash.clear();//清空 z%=p;//注意先取膜 ll t=sqrt(p)+1;//注意向上取整 for(ll i=0;i
=0&&~j)//试试 2 2 3这样的情况? return i*t-j; } return -1;}int main(){ int t,k; scanf("%d%d",&t,&k); while(t--) { ll y,z,p; scanf("%lld%lld%lld",&y,&z,&p); if(k==1) printf("%lld\n",work1(y,z,p)); else if(k==2) { ll ans=work2(y,z,p); if(~ans) printf("%lld\n",ans); else printf("Orz, I cannot find x!\n"); } else { ll ans=work3(y,z,p); if(~ans) printf("%lld\n",ans); else printf("Orz, I cannot find x!\n"); } } return 0;}

2018.9.11

转载于:https://www.cnblogs.com/butterflydew/p/9627717.html

你可能感兴趣的文章
Silverlight入门
查看>>
Silverlight动态调用WEBSERVICE,WCF方法
查看>>
LeetCode 895. Maximum Frequency Stack
查看>>
模仿segmentfault 评论
查看>>
一个简单的日志函数C++
查看>>
Java 8 中如何优雅的处理集合
查看>>
IOS程序的启动过程
查看>>
连接Linux下 XAMPP集成环境中部署的禅道的数据库MariaDB
查看>>
Java操作Excel和Word
查看>>
Oracle 体系结构之ORACLE物理结构
查看>>
ORA-12538: TNS: no such protocol adapter
查看>>
盒子模型
查看>>
局域网协议
查看>>
[HNOI2012]永无乡 线段树合并
查看>>
Spring整合hibernate:3、使用XML进行声明式的事务管理
查看>>
SqlServer之Convert 函数应用格式化日期(转)
查看>>
软件测试领域中的10个生存和发展技巧
查看>>
Camera前后摄像头同时预览
查看>>
HDU 1856
查看>>
课堂作业01--架构师的职责
查看>>