N次剩余

题目:http://acm.sgu.ru/problem.php?

contest=0&problem=261

题意:给定n,a,p 求出x^n ≡ a(mod p)在模p意义下的全部解,当中p是素数

说明:

代码:

/*
ID: wuqi9395@126.com
PROG:
LANG: C++
*/
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<fstream>
#include<cstring>
#include<ctype.h>
#include<iostream>
#include<algorithm>
#define INF (1<<30)
#define PI acos(-1.0)
#define mem(a, b) memset(a, b, sizeof(a))
#define rep(i, n) for (int i = 0; i < n; i++)
#define debug puts("===============")
using namespace std;
typedef long long ll; //高速幂
ll pow_mod(ll a, ll n, ll m) {
ll res = 1;
while(n) {
if (n & 1) res = res * a % m;
n >>= 1;
a = a * a % m;
}
return res;
} //求原根
vector<ll> a;
bool g_test(ll g, ll p) {
for (ll i = 0; i < a.size(); i++)
if (pow_mod(g, (p - 1) / a[i], p) == 1) return 0;
return 1;
}
ll primitive_root(ll p) {
a.clear();
ll tmp = p - 1;
for (ll i = 2; i <= tmp / i; i++) if (tmp % i == 0) { //这里还能够用筛素数优化
a.push_back(i);
while(tmp % i == 0) tmp /= i;
}
if (tmp != 1) a.push_back(tmp);
ll g = 1;
while(true) {
if (g_test(g, p)) return g;
g++;
}
} // 求离散对数
#define N 111111
struct node {
ll x, id;
bool operator < (const node & T) const {
if (x == T.x) return id < T.id;
return x < T.x;
}
}E[N];
ll discrete_log(ll x, ll n, ll m) {
int s = sqrt(m + 0.5);
for (; (ll) s * s <= m; ) s++;
ll cur = 1;
node tmp;
for (int i = 0; i < s; i++) {
tmp.id = i, tmp.x = cur;
E[i] = tmp;
cur = cur * x % m;
}
sort(E, E + s);
ll mul = pow_mod(cur, m - 2, m) % m; // mul = 1 / (x^s)
cur = 1;
for (int i = 0; i < s; i++) {
ll more = (ll) n * cur % m;
tmp.id = -1, tmp.x = more;
int pos = lower_bound(E, E + s, tmp) - E;
if (E[pos].x == more) return i * s + E[pos].id;
cur = cur * mul % m;
}
return -1;
} //扩展欧几里得
ll extend_gcd(ll a, ll b, ll &x, ll &y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
else {
ll r = extend_gcd(b, a % b, y, x);
y -= x * (a / b);
return r;
}
} //N次剩余
//给定n,a,p 求出x^n ≡ a(mod p)在模p意义下的全部解,当中p是素数
vector<ll> residue(ll p, ll n, ll a) {
vector<ll> ret;
if (a == 0) {
ret.push_back(0);
return ret;
}
ll g = primitive_root(p);
ll m = discrete_log(g, a, p);
if (m == -1) return ret;
ll A = n, B = p - 1, C = m, x, y;
ll d = extend_gcd(A, B, x, y);
if (C % d != 0) return ret;
x = x * (C / d) % B;
ll delta = B / d;
for (int i = 0; i < d; i++) {
x = ((x + delta) % B + B) % B;
ret.push_back(pow_mod(g, x, p));
}
sort(ret.begin(), ret.end());
ret.erase(unique(ret.begin(), ret.end()), ret.end());
return ret;
}
int main () {
ll n, a, p;
scanf("%lld%lld%lld", &p, &n, &a);
vector<ll> ret = residue(p, n, a);
printf("%d\n", ret.size());
for (int i = 0; i < ret.size(); i++) printf("%d ", ret[i]);
return 0;
}

SGU 261. Discrete Roots (N次剩余)的更多相关文章

  1. SGU 261. Discrete Roots

    给定\(p, k, A\),满足\(k, p\)是质数,求 \[x^k \equiv A \mod p\] 不会... upd:3:29 两边取指标,是求 \[k\text{ind}_x\equiv ...

  2. HDU1163 Eddy&#39;s digital Roots【九剩余定理】

    Eddy's digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  3. sgu 261

    学习了元根的一些知识,哈哈. 总结一下: 几个概念: 阶:对于模数m和整数a,并且gcd(m,a)==1,那么定义a在模m下的阶r为满足ar=1 mod m的最小正整数. 性质1:r in [1,ph ...

  4. 一些数论概念与算法——从SGU261谈起

    话说好久没来博客上面写过东西了,之前集训过于辛苦了,但有很大的收获,我觉得有必要把它们拿出来总结分享.之前一直是个数论渣(小学初中没好好念过竞赛的缘故吧),经过一道题目对一些基础算法有了比较深刻的理解 ...

  5. UVA 1426 - Discrete Square Roots(数论)

    UVA 1426 - Discrete Square Roots 题目链接 题意:给定X, N. R.要求r2≡x (mod n) (1 <= r < n)的全部解.R为一个已知解 思路: ...

  6. UVa 1426 Discrete Square Roots (扩展欧几里德)

    题意:给定 x,n,r,满足 r2 ≡ x mod(n) ,求在 0 ~ n 内满足 rr2 ≡ x mod(n) 的所有的 rr. 析:很明显直接是肯定不行了,复杂度太高了. r2 ≡ x mod( ...

  7. Discrete Square Roots UVALive - 4270(拓展欧几里得)

    a≡b(mod n)的含义是“a和b除以n的余数相同”,其充要条件是“a-b是n的整数倍”: 求所有满足条件r^2=x(mod m)的r 题目已经给定了一个初始的r,x,m #include < ...

  8. UVALive 4270 Discrete Square Roots

    题目描述: 在已知一个离散平方根的情况下,按照从小到大的顺序输出其他所有的离散平方根. 在模n意义下,非负整数x的离散平方根是满足0<=r<n且r2=x(mod n)的整数r. 解题思路: ...

  9. UVALive - 4270 Discrete Square Roots (扩展欧几里得)

    给出一组正整数$x,n,r$,使得$r^2\equiv x(mod\: n)$,求出所有满足该等式的$r$. 假设有另一个解$r'$满足条件,则有$r^2-r'^2=kn$ 因式分解,得$(r+r') ...

随机推荐

  1. 01XML文档结构

    文档结构 2.1文档结构 2.1.1文档声明及字符编码 <?xml version=“1.0” encoding=“”gb2312 standalone=“yes”?> <?  告诉 ...

  2. java上传文件大小转换(字节转kb/mb/gb)

    /** * 字节转kb/mb/gb * @param size * @return */ public String getPrintSize(long size) { //如果字节数少于1024,则 ...

  3. 洛谷——P2055 [ZJOI2009]假期的宿舍

    P2055 [ZJOI2009]假期的宿舍 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 ...

  4. mybatis中修改了数据,控制台显示成功,数据库没有修改

    在mybatis中遇到了修改数据时,控制台显示修改成功,但是去数据库查看并没有修改,这是因为mybatis不时自动提交事务的,所以是不会修改数据库的数据,这是我们加上一句 sqlSession.com ...

  5. linux 负载各项查看命令

    free -h top -c 查看使用情况 sar -r/s/b 查看IO状态 iostat -x 1 10 查看服务器的状态 vmstat 查看内存使用率最后的前10个进程 ps -aux |sor ...

  6. 拥抱变革(More Fearless Change)

    今天从大敏捷群中了解到Tid2017的一个讲演,一位敏捷教练,组织变革的专著的作者Linda的讲演. <More Fearless Change-Strategy for Making Your ...

  7. 【05】AJAX实例-检测用户名是否存在(实例)

    AJAX实例-检测用户名是否存在   用户注册时,需要填写个人信息,其中包括用户名.当用户输入完成时,JavaScript 需要及时检测用户名是否存在,如果存在给出提示,请用户更换用户名. 当然,这个 ...

  8. hihoCoder#1051 补提交卡

    原题地址 简单贪心 首先,补提交卡应该连续使用,其次,补提交卡应该全部用掉(如果补提交卡多于未提交天数则额外处理) 所以,依次遍历未提交日期,计算:从当前位置开始,用M张补提交卡覆盖后面连续M个数字, ...

  9. Python模块:logging、

    logging模块: 很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出.Python的logging模块提供了标准的日志接口,你可以通过它存储各种格 ...

  10. Mysql UPDATE 操作时含 Limit 注意事项

    在update时,可以使用limit来设置,更新的条数,但下面这句sql语句是错误的. LIMIT ,; //错误提示:ERROR 1064 (42000): You have an error in ...