题解 UVA10225 Discrete Logging
本题是一道 \(BSGS\) 裸题,用于求解高次同余方程,形如 \(a^x\equiv b(\mod p)\),其中 \(a\),\(p\) 互质(不互质还有 \(EXBSGS\))。
建议多使用 \(HASH\) 表,不要懒省事使 \(map\),数据大时会 \(T\) 飞。
\(AC \kern 0.4emCODE:\)
#include<bits/stdc++.h>
#define int long long
#define ri register int
#define p(i) ++i
#define H(x) ((x)%P+1)
using namespace std;
const int P=65537;
inline 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<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
struct HASH{
struct Hash{
int v,nxt,w;
}H[P+7];
int first[P+7],t;
inline void init() {memset(first,0,sizeof(first));t=1;}
inline void add(int v,int w) {
int u=H(v);
H[t].v=v;
H[t].w=w;
H[t].nxt=first[u];
first[u]=t++;
}
inline int find(int v) {
int u=H(v);
for (ri i(first[u]);i;i=H[i].nxt) if (H[i].v==v) return H[i].w;
return -1;
}
}H;
inline int fpow(int x,int y,int p) {
int res=1;
while(y) {
if (y&1) res=res*x%p;
x=x*x%p;y>>=1;
}
return res;
}
inline int BSGS(int a,int b,int p) {
H.init();b%=p;
int t=ceil(sqrt(p));//注意这里,ceil(sqrt(p))与sqrt(p)+1没什么区别,但后者会WA,有可能是数据有锅,p非质数了。
for (ri i(0);i<=t;p(i)) H.add(b,i),b=b*a%p;
int c=1;a=fpow(a,t,p);
if (!a) return !b?1:-1;
for (ri i(0);i<=t;p(i)) {
int j=H.find(c);
if (j>=0&&i*t-j>=0) return i*t-j;
c=c*a%p;
}
return -1;
}
signed main() {
int p,a,b;
while(scanf("%lld",&p)!=EOF) {
a=read(),b=read();
int ans=BSGS(a,b,p);
if (ans==-1) printf("no solution\n");
else printf("%lld\n",ans);
}
return 0;
}
题解 UVA10225 Discrete Logging的更多相关文章
- 【BSGS】BZOJ3239 Discrete Logging
3239: Discrete Logging Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 729 Solved: 485[Submit][Statu ...
- 【BZOJ3239】Discrete Logging BSGS
[BZOJ3239]Discrete Logging Description Given a prime P, 2 <= P < 231, an integer B, 2 <= B ...
- [POJ2417]Discrete Logging(指数级同余方程)
Discrete Logging Given a prime P, 2 <= P < 2 31, an integer B, 2 <= B < P, and an intege ...
- poj 2417 Discrete Logging ---高次同余第一种类型。babystep_gaint_step
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2831 Accepted: 1391 ...
- BSGS算法+逆元 POJ 2417 Discrete Logging
POJ 2417 Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4860 Accept ...
- POJ 2417 Discrete Logging (Baby-Step Giant-Step)
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2819 Accepted: 1386 ...
- POJ2417 Discrete Logging【BSGS】
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5577 Accepted: 2494 ...
- Discrete Logging
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5865 Accepted: 2618 ...
- BSGS 扩展大步小步法解决离散对数问题 (BZOJ 3239: Discrete Logging// 2480: Spoj3105 Mod)
我先转为敬? orz% miskcoo 贴板子 BZOJ 3239: Discrete Logging//2480: Spoj3105 Mod(两道题输入不同,我这里只贴了3239的代码) CODE ...
随机推荐
- 浅谈C++11中的多线程(一)
摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 同步互斥原理以及多进程和多线程中实现同步互斥的两种方法 Qt中的多线程应用 c++ ...
- java基础---常用类
一.字符串类String String:字符串,使用一对""引起来表示,字符串常量池在方法区中 public final class String implements java. ...
- 使用Nginx和uwsgi部署Flask项目
前言 之前用Flask框架开发了一个Python的Web项目,使用Nginx和uWSGI部署起来感觉挺麻烦,过程中还因为对Flask框架的不熟悉,花了好长时间才把应用完全部署起来.下面分享部署成功 ...
- 基于Ryu的流量采集代码实现
1 from __future__ import division 2 import time 3 import math 4 import xlwt 5 from ryu.controller im ...
- python正则表达式应用
import re ab='''ms: [["", "\u7acb\u5373\u4e0b\u8f7d"], ["", "\u52 ...
- 三分钟掌握共享内存 & Actor并发模型
吃点好的,很有必要.今天介绍常见的两种并发模型: 共享内存&Actor 共享内存 面向对象编程中,万物都是对象,数据+行为=对象: 多核时代,可并行多个线程,但是受限于资源对象,线程之间存在对 ...
- python + pytest基本使用方法(拓展库)
一.测试钩子配置文件 import pytest# conftest.py 是pytest特有的本地测试配置文件;# 既可以用来设置项目级别的Fixture,也可用来导入外部插件,还可以指定钩子函数# ...
- Leetcode:面试题55 - II. 平衡二叉树
Leetcode:面试题55 - II. 平衡二叉树 Leetcode:面试题55 - II. 平衡二叉树 Talk is cheap . Show me the code . /** * Defin ...
- xampp中修改mysql默认空密码
打卡记录: 1. mysql用户的相关信息是保存在mysql数据库的user表中的,并且该表的密码字段(Password)是通过PASSWORD方法加密存储的,所以不能直接修改成123456. 2. ...
- 新iPhone有望加入指纹解锁,你会买吗?
苹果新款iPhone即将在9月份正式发布,或命名为iPhone 13或者iPhone 12s.据外媒报道,新一代iPhone的屏幕和相机都将迎来重大升级,同时还将首次加入屏下指纹解锁技术.你期待吗? ...