[拓展Bsgs] Clever - Y
题目链接 Clever - Y
题意
有同余方程 \(X^Y \equiv K\ (mod\ Z)\),给定\(X\),\(Z\),\(K\),求\(Y\)。
解法
如题,是拓展 \(Bsgs\) 板子,部分学习内容在这里 \((Click\ here)\)。
敲完板子就能获得至少 5 倍经验。
过程中疯狂 \(WA\) 所以总结需要注意的几点……
· 令 \(m = sqrt(p) + 1\) 比较保险,不然有的时候会枚举不到
· 在令 \(a\),\(p\) 互质的循环中,\(b = d\) 时及时返回是有必要的
· 同时在以上步骤中,\((a, p)\) 可能恒不等于\(1\),所以也要判
· \(map\) 慢的一批!慢的一批!手写个效率有保证的类似哈希表的东西
类似的题目
[Hdu 2815] Mod Tree
[Poj 2417] Discrete Logging
[CQOI2018] 破解D-H协议
代码……
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long u64;
class Hash_table {
private:
vector<u64> value;
vector<pair<u64, u64> > funcn;
public:
inline void clear() { value.clear(), funcn.clear(); }
inline void sortv() { sort(value.begin(), value.end()); }
inline void push(u64 x, u64 p) { value.push_back(x), funcn.push_back(make_pair(x, p)); }
inline bool find(u64 x) {
int k = lower_bound(value.begin(), value.end(), x) - value.begin();
return (k != value.size()) && (value[k] == x);
}
inline int posi(u64 x) {
for(int i = 0; i < funcn.size(); ++i)
if( funcn[i].first == x ) return funcn[i].second;
}
} lg;
inline u64 Fast_pow(u64 x, u64 p, u64 m) {
u64 ans = 1;
if( p < 0 ) return ans;
for( ; p; x = x * x % m, p = p >> 1) if( p & 1 ) ans = x * ans % m;
return ans;
}
inline u64 Ex_gcd(u64 a, u64 b, u64 &x, u64 &y) {
if( !b ) { x = 1, y = 0; return a; }
u64 d = Ex_gcd(b, a % b, y, x); y = y - a / b * x;
return d;
}
inline u64 Gcd(u64 a, u64 b) { return !b ? a : Gcd(b, a % b); }
inline u64 Inverse(u64 a, u64 p) {
u64 x = 0, y = 0, g = Ex_gcd(a, p, x, y);
return g == 1 ? (x + p) % p : -1ll;
}
inline u64 Solve_fun(u64 a, u64 b, u64 p) {
u64 g = Gcd(a, p), inv = 1, x = 0, y = 0;
if( b % g ) return -1ll;
a = a / g, b = b / g, p = p / g;
inv = Inverse(b, p), a = a * inv % p, b = 1;
Ex_gcd(a, p, x, y), x = (x + p) % p;
return ~inv ? x : -1ll;
}
inline u64 Ex_bsgs(u64 a, u64 b, u64 p) {
u64 m = 1, d = 1, num = 0, base = 1, pow_a = 1, ans = -1;
for(u64 g = Gcd(a, p); g != 1ll; g = Gcd(a, p), ++num) {
if( num > 31 || b % g ) return -1ll;
b = b / g, p = p / g, d = d * (a / g) % p;
if( b == d ) return num + 1;
}
m = sqrt(p) + 1, base = Fast_pow(a, m, p), lg.clear(), lg.push(1ll, 0ll);
for(u64 i = 1; i <= m + num; ++i) pow_a = pow_a * a % p, lg.push(pow_a, i);
lg.sortv();
for(u64 tmp, i = 0; i <= m; ++i) {
tmp = Solve_fun(d % p, b, p), d = d * base % p;
if( ~tmp && lg.find(tmp) ) { ans = i * m + lg.posi(tmp) + num; break; }
}
return ans;
}
int main(int argc, const char *argv[])
{
u64 a = 0, b = 0, p = 0, ans = 0;
while( ~scanf("%lld%lld%lld", &a, &p, &b) ) if( p ) {
ans = Ex_bsgs(a, b, p);
~ans ? printf("%lld\n", ans) : printf("No Solution\n");
}
return 0;
}
—— 我们还会继续与人萍水相逢,为了新的别离。
[拓展Bsgs] Clever - Y的更多相关文章
- 【POJ 3243】Clever Y 拓展BSGS
调了一周,我真制杖,,, 各种初始化没有设为1,,,我当时到底在想什么??? 拓展BSGS,这是zky学长讲课的课件截屏: 是不是简单易懂.PS:聪哥说“拓展BSGS是偏题,省选不会考,信我没错”,那 ...
- bzoj 1467: Pku3243 clever Y 扩展BSGS
1467: Pku3243 clever Y Time Limit: 4 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description 小 ...
- poj3243 Clever Y[扩展BSGS]
Clever Y Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 8666 Accepted: 2155 Descript ...
- luogu2485 [SDOI2011]计算器 poj3243 Clever Y BSGS算法
BSGS 算法,即 Baby Step,Giant Step 算法.拔山盖世算法. 计算 \(a^x \equiv b \pmod p\). \(p\)为质数时 特判掉 \(a,p\) 不互质的情况. ...
- 数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)
什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSG ...
- 【SPOJ】Power Modulo Inverted(拓展BSGS)
[SPOJ]Power Modulo Inverted(拓展BSGS) 题面 洛谷 求最小的\(y\) 满足 \[k\equiv x^y(mod\ z)\] 题解 拓展\(BSGS\)模板题 #inc ...
- bzoj1467 Pku3243 clever Y
1467: Pku3243 clever Y Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 313 Solved: 181[Submit][Status ...
- 数学:拓展BSGS
当C不是素数的时候,之前介绍的BSGS就行不通了,需要用到拓展BSGS算法 方法转自https://blog.csdn.net/zzkksunboy/article/details/73162229 ...
- 【BZOJ1467/2480】Pku3243 clever Y/Spoj3105 Mod EXBSGS
[BZOJ1467/2480]Pku3243 clever Y/Spoj3105 Mod Description 已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x. Input ...
随机推荐
- vue.js的手脚架vue-cli项目搭建的步骤
手脚架是什么? 众所周知,现在的前端项目发展得越渐越大,我们前端程序员要从0开始去搭建一套完整的项目很费时,所以这时候前端工程的手脚架就出现了. 我用得vue-cli也是其中之一,还有其他的我也说不清 ...
- Asp.Net Core 实现谷歌翻译ApI 免费版
由于谷歌翻译官方API是付费版本,本着免费和开源的精神.分享一下用 Net Core 实现谷歌翻译API的代码. 项目引用的Nuget 包: ChakraCore.NET Newtonsoft.Jso ...
- 进程命令(taskkill)
taskkill 命令: // 描述: 结束一个或多个任务或流程. // 语法: taskkill [/s <computer> [/u [<Domain>\]<User ...
- Vue学习之路1-集成环境安装
1.前言 Vue 是一款友好的.多用途且高性能的javascript框架,与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用,它能够帮你创建可维护性和可测试性更强的代码库,Vue是渐进式的j ...
- 既然CPU同一时间只能执行一个线程,为什么存在并发问题
一点小疑惑终于解开啦 1.CPU的时间是按时间片分的,而不是一个时间点,并发问题是由于CPU线程切换导致的. 现在假设有一段代码 if(i == 1) { i++; //断点1 system.out. ...
- 英语口语练习系列-C21-美式幽默
1. 基础词汇 1.1 back [bæk] n. 后背 on the back 靠着背 sleep on the back 仰着睡 back of the chair 椅子的后背 stab sb. ...
- 【笔记】Python集成开发环境——PyCharm 2018.3下载、注册、帮助文档
[博客导航] [Python导航] 前言 使用好的开发环境将有效提高编程效率,在Python使用上我是小白,所以特意请教了从事语言处理的成同学,告知我,推荐使用Pycharm和IntelliJ. 目前 ...
- Tree 树形结构
一.树的基本概念 (1)树(Tree)的概念:树是一种递归定义的数据结构,是一种重要的非线性数据结构. 树可以是一棵空树,它没有任何的结点:也可以是一棵非空树,至少含有一个结点. (2)根(Root) ...
- 【Teradata SQL】禁用和启用数据库用户登录
1.禁用数据库用户登录 禁用登录后,再次登录会报用户或密码错误.执行命令如下: //使用dbc用户执行SELECT 'REVOKE LOGON ON ALL FROM '||USERNAME||';' ...
- 日志学习系列(四)——NLog实例
具体不想介绍了,新建一个解决方案 ,直接用NuGet安装就行了 具体项目代码可以在https://github.com/qiuxianhu/SimpleNLog下载