解一类x^a = b (mod p)的方程

该博客讨论了解一类特殊方程x^a = b (mod p)的方法,其中p是素数。问题要求求解方程的个数及可能的和。当给定方程的参数时,可以通过快速幂、寻找原根和使用离散对数来解决。对于100%的数据,需要考虑方程无解、有一个解或多个解的情况,并利用等比数列求和公式来求解和。
摘要由CSDN通过智能技术生成

Problem 1. modlog
Input file: modlog.in
Output file: modlog.out
Time limit: 1 second
Memory limit: 256 MB
Mr.H 最近在练习解方程,最近他发现了一类有趣的方程,希望你能帮忙解决。给出a; b; p,希望你能
帮忙解如下方程:x^a = b (mod p)
其中:0 <= x < p (保证p 是素数)
你需要输出解的个数,你还可能需要输出这些解的和。
Input
第1 行1 个整数:T,表示方程个数。
接下来1 行,一个整数type,如果type = 0,表示不需要输出解的和,如果type = 1,表示需要输出解的和。
接下来T 行,每行3 个整数:a b p,表示一个方程。
Output
对于每个方程,输出1 行,第一个整数表示解的个数,如果type = 1, 还需要在同一行输出所有解的和摸p。
Sample
modlog.in
2
1
1 3 5
2 4 7
modlog.out
1 3
2 0
modlog.in
2
0
1 3 5
2 4 7
modlog.out
1
2
Note
. 对于10% 的数据,2 <= p <= 50;
. 对于30% 的数据,2 <= p <= 1000;
. 对于另外30% 的数据,2 <= p <= 10^9 + 10,type = 0。
. 对于100% 的数据,2 <= p <= 10^9 + 10,0 <= type <= 1,1 <= a <= p .. 1, 0 <= b < p, 1 <= T <= 1000。

思路:
1.1 10%
暴力,不用快速幂。
1.2 30%
暴力,用快速幂。
1.3 另外30%
xa = b (mod m)
如果b 为0,那么只有x = 0 一个解。所以以下讨论都建立在b != 1 的基础上。
首先找到m 的一个元根g,然后求b 的离散对数indgb,方程就变成了:
aindgx = indgb (mod m-1)
这个方程的每个解对应于原方程的一个解。
具体来说,如果gcd(a,m-1) 不整除 indgb,那么原方程无解,否则有gcd(a,m-1) 个解。
1.4 100%
假如我们解出了上面那个方程:
indgx = r (mod s)
其中:
s = (m-1)/gcd(a,m-1)
我们的gcd(a,m-1) 个解就是:
g^r; g^r+s; g^r+2s; ….; g^r+m-1-s
如果公比是1,即g^s = 1 (mod m),那么和就是gcd(a,m-1)g^r。
如果公比不是1,那么由等比数列求和公式我们会发现答案为0 (mod m)。

原根的求解证明
解一类A^x=B(mod C)(C是质数)的方程 (BSGS)

#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;

const int lim=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值