/*poj 3243
*解决高次同余方程的应用,已知 X^Y = K mod Z, 及X,Z,K的值,求 Y 的值
*/ #include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define lint __int64
#define MAXN 131071
struct HashNode { lint data, id, next; };
HashNode hash[MAXN<<1];
bool flag[MAXN<<1];
lint top; void Insert ( lint a, lint b )
{
lint k = b & MAXN;
if ( flag[k] == false )
{
flag[k] = true;
hash[k].next = -1;
hash[k].id = a;
hash[k].data = b;
return;
}
while( hash[k].next != -1 )
{
if( hash[k].data == b ) return;
k = hash[k].next;
}
if ( hash[k].data == b ) return;
hash[k].next = ++top;
hash[top].next = -1;
hash[top].id = a;
hash[top].data = b;
} lint Find ( lint b )
{
lint k = b & MAXN;
if( flag[k] == false ) return -1;
while ( k != -1 )
{
if( hash[k].data == b ) return hash[k].id;
k = hash[k].next;
}
return -1;
} lint gcd ( lint a, lint b )
{
return b ? gcd ( b, a % b ) : a;
} lint ext_gcd (lint a, lint b, lint& x, lint& y )
{
lint t, ret;
if ( b == 0 )
{
x = 1, y = 0;
return a;
}
ret = ext_gcd ( b, a % b, x, y );
t = x, x = y, y = t - a / b * y;
return ret;
} lint mod_exp ( lint a, lint b, lint n )
{
lint ret = 1;
a = a % n;
while ( b >= 1 )
{
if( b & 1 )
ret = ret * a % n;
a = a * a % n;
b >>= 1;
}
return ret;
} lint BabyStep_GiantStep ( lint A, lint B, lint C )
{
top = MAXN; B %= C;
lint tmp = 1, i;
for ( i = 0; i <= 100; tmp = tmp * A % C, i++ )
if ( tmp == B % C ) return i; lint D = 1, cnt = 0;
while( (tmp = gcd(A,C)) !=1 )
{
if( B % tmp ) return -1;
C /= tmp;
B /= tmp;
D = D * A / tmp % C;
cnt++;
} lint M = (lint)ceil(sqrt(C+0.0));
for ( tmp = 1, i = 0; i <= M; tmp = tmp * A % C, i++ )
Insert ( i, tmp ); lint x, y, K = mod_exp( A, M, C );
for ( i = 0; i <= M; i++ )
{
ext_gcd ( D, C, x, y ); // D * X = 1 ( mod C )
tmp = ((B * x) % C + C) % C;
if( (y = Find(tmp)) != -1 )
return i * M + y + cnt;
D = D * K % C;
}
return -1;
} int main()
{
lint A, B, C;
while( scanf("%I64d%I64d%I64d",&A,&C,&B ) !=EOF )
{
if ( !A && !B && !C ) break;
memset(flag,0,sizeof(flag));
lint tmp = BabyStep_GiantStep ( A, B, C );
if ( tmp == -1 )puts("No Solution");
else printf("%I64d\n",tmp);
}
return 0;
}

ACM_高次同余方程的更多相关文章

  1. 数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)

    什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSG ...

  2. 【解高次同余方程】51nod1038 X^A Mod P

    1038 X^A Mod P 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 X^A mod P = B,其中P为质数.给出P和A B,求< P的所有X. 例如:P = 11 ...

  3. 『高次同余方程 Baby Step Giant Step算法』

    高次同余方程 一般来说,高次同余方程分\(a^x \equiv b(mod\ p)\)和\(x^a \equiv b(mod\ p)\)两种,其中后者的难度较大,本片博客仅将介绍第一类方程的解决方法. ...

  4. 高次同余方程模板BabyStep-GiantStep

    /************************************* ---高次同余方程模板BabyStep-GiantStep--- 输入:对于方程A^x=B(mod C),调用BabySt ...

  5. POJ 3243 Clever Y (求解高次同余方程A^x=B(mod C) Baby Step Giant Step算法)

    不理解Baby Step Giant Step算法,请戳: http://www.cnblogs.com/chenxiwenruo/p/3554885.html #include <iostre ...

  6. 高次同余方程 $BSGS$

    第一篇\(Blog\)... 还是决定把\(luogu\)上的那篇搬过来了. BSGS,又名北上广深 它可以用来求\(a^x \equiv b (mod \ n)\)这个同余方程的一个解,其中\(a, ...

  7. 解高次同余方程 (A^x=B(mod C),0<=x<C)Baby Step Giant Step算法

    先给出我所参考的两个链接: http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4 (AC神,数论帝  扩展Baby Step Gian ...

  8. 【hdu2815-Mod Tree】高次同余方程-拓展BadyStepGaintStep

    http://acm.hdu.edu.cn/showproblem.php?pid=2815 题意:裸题... 关于拓展BSGS的详细解释我写了一篇博文:http://www.cnblogs.com/ ...

  9. 【poj3243-Clever Y】高次同余方程-拓展BabyStepGiantStep

    http://poj.org/problem?id=3243 题意:给定X,Z,K,求一个最小的Y满足XY mod Z = K. 关于拓展BSGS的详细解释我写了一篇博文:http://www.cnb ...

随机推荐

  1. 王者齐聚!Unite 2017 Shanghai 日程讲师全揭晓

    汇聚了来自全球的 Unity开发者.发行商.培训家及爱好者的 Unite 2017 Shanghai 即将于于 5 月 11 日-13日在上海·国际会议中心隆重举行.Unite 大会是由 Unity ...

  2. bzoj 2727: [HNOI2012]双十字

    Description 在C 部落,双十字是非常重要的一个部落标志.所谓双十字,如下面两个例子,由两条水平的和一条竖直的"1"线段组成,要求满足以下几个限制: 我们可以找到 5 个 ...

  3. bzoj 2109: [Noi2010]Plane 航空管制

    Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频 发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此, 小X表示很不满意. 在这次来烟台的 ...

  4. MySql监控优化

    MySQL监控   MySQL服务器硬件和OS(操作系统)调优:   1.有足够的物理内存,能将整个InnoDB文件加载到内存里 —— 如果访问的文件在内存里,而不是在磁盘上,InnoDB会快很多. ...

  5. Spring 自动装配及自动注册的相关配置

    Spring支持好几种自动装配(Autowiring)的方式,以及自动扫描并注册Bean的配置(在beans.xml中配置). 下文我们进行一个小结. 1. <context: annotati ...

  6. Android 执行 adb shell 命令

    Android 执行Adb shell 命令大多需要root权限,Android自带的Runtime. getRuntime().exec()容易出错,在网上找到了一个执行adb shell命令的类 ...

  7. MySQL字符串相关函数学习一

    这里总结一下常用的或者有可能用到的一些字符串内建函数 ① ASCII() :返回字符的ASCII码 如果输入的不是一个字符而是一个字符串呢?ascii()会只取第一个字符作为计算的参数,如: ② CH ...

  8. 微信小程序开发之模板

    一.简介 WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用. 定义模板 使用name属性,作为模板的名字.然后在<template/>内定义代码片段,如 ...

  9. SQLServer Agent执行[分发清除: distribution] 无法删除快照文件

    由于之前创建的发布订阅造成严重的性能压力,症状表现为发布订阅表查询产生CMEMTHREAD  suspend等待,由于开发配置每隔十分钟会产生大量的SQLCOMMAND(create table,cr ...

  10. Netty入门之客户端与服务端通信(二)

    Netty入门之客户端与服务端通信(二) 一.简介 在上一篇博文中笔者写了关于Netty入门级的Hello World程序.书接上回,本博文是关于客户端与服务端的通信,感觉也没什么好说的了,直接上代码 ...