【TJOI 2007】可爱的质数

博客给出一道关于求解最小l值的题目,已知质数p、整数b和n,要求计算满足bl≡n(modp)的最小l。介绍了输入输出格式及样例数据,指出这是BSGS模板题,具体讲解可看另一篇相关博客,最后给出代码部分。

【题目】

传送门

题目描述:

给定一个质数 p p p 2 ≤ p &lt; 2 31 2≤p&lt;2^{31} 2p<231),以及一个整数 b b b 2 ≤ b &lt; p 2≤b&lt;p 2b<p),一个整数 n n n 2 ≤ n &lt; p 2≤n&lt;p 2n<p)。现在要求你计算一个最小的 l l l,满足 b l ≡ n ( &ThinSpace; m o d &ThickSpace; p ) b^l ≡ n (\,\mathrm{mod}\; p) bln(modp)

输入格式:

输入仅一行,有 3 3 3 个整数,依次代表 p p p b b b n n n

输出格式:

输出仅一行,如果有 l l l 满足该要求,输出最小的 l l l,否则输出 “no solution”

样例数据:

输入
5 2 3

输出
3

备注:

【提示】

对于任意的质数 p p p 和任意的整数 m m m,我们定义: b − m ≡ b p − 1 − m b^{-m} ≡b^{p-1-m} bmbp1m


【分析】

这是一道 BSGS 的模板题。

具体的讲解就看我的另一篇博客 BSGS


【代码】

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<tr1/unordered_map>
#define ll long long
using namespace std;
using namespace tr1;
unordered_map<int,int>Hash;
int Power(int a,int b,int p)
{
	int ans=1;
	for(;b;b>>=1,a=(ll)a*a%p)if(b&1)ans=(ll)ans*a%p;
	return ans;
}
int BSGS(int a,int b,int p)
{
	b%=p;
	int i,t=ceil(sqrt(p));
	for(i=0;i<t;++i)
	  Hash[(ll)b*Power(a,i,p)%p]=i;
	a=Power(a,t,p);
	if(!a)  return b?-1:1;
	for(i=0;i<=t;++i)
	{
		int val=Power(a,i,p);
		int j=(Hash.find(val)==Hash.end())?-1:Hash[val];
		if(j>=0&&i*t-j>=0)  return i*t-j;
	}
	return -1;
}
int main()
{
	int a,b,p;
	scanf("%d%d%d",&p,&a,&b);
	int ans=BSGS(a,b,p);
	if(~ans)  printf("%d",ans);
	else  printf("no solution");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值