列表

详情


NC232607. X^2 Mod P

描述

X*X mod P = A,其中P为质数。给出P和A,求<=P的所有X。

输入描述

两个数P A,中间用空格隔开。(1 <= A < P <= 1000000, P为质数)

输出描述

输出符合条件的X,且0 <= X <= P,如果有多个,按照升序排列,中间用空格隔开。
如果没有符合条件的X,输出:No Solution

示例1

输入:

13 3

输出:

4 9

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 476K, 提交时间: 2022-08-16 11:56:56

#include<bits/stdc++.h>
using namespace std ;
#define ll long long
ll w ;
struct P
{
	ll x,y ;
};
P mul(const P &a,const P &b,ll p)
{
	P res ;
	res.x=(a.x*b.x+a.y*b.y%p*w)%p ;
	res.y=(a.x*b.y+a.y*b.x)%p ;
	return res ;
}
P P_qsm(P a,ll b,ll mod)
{
	P ans={1,0} ;
	while(b)
	{
		if(b&1) ans=mul(ans,a,mod) ;
		a=mul(a,a,mod) ; b>>=1 ;
	}
	return ans ;
}
ll qsm(ll a,ll b,ll mod)
{
	ll ans=1 ;
	while(b)
	{
		if(b&1) ans=ans*a%mod ;
		a=a*a%mod ; b>>=1 ;
	}
	return ans ;
}
mt19937 mt(time(0)) ;
ll Legendre(ll a,ll p) { return qsm(a,(p-1)>>1,p) ; }
ll equation_solve(ll b,ll p)
{
	if(p==2) return 1 ;
	if((Legendre(b,p)+1)%p==0) return -1 ;
	ll a ;
	while(1)
	{
		a=uniform_int_distribution<ll>(0,p-1)(mt) ;
		//a=rand()%p ;
		w=((a*a-b)%p+p)%p ;
		if((Legendre(w,p)+1)%p==0)
			break ;
	}
	return P_qsm({a,1},(p+1)>>1,p).x ;
}
int main()
{
	int T=1 ; 
	while(T--)
	{
		ll a,p ;
		cin>>p>>a ;
		a=a%p ;
		ll x=equation_solve(a,p) ;
		if(x==-1) puts("No Solution") ;
		else
		{
			ll y=p-x ;
			if(x==y) cout<<x<<'\n' ;
			else cout<<min(x,y)<<' '<<max(x,y)<<'\n' ;
		}
	}
	return 0 ;
}

C++ 解法, 执行用时: 13ms, 内存消耗: 572K, 提交时间: 2022-01-16 18:21:23

#include <stdio.h>
int main()
{
	int x=1,p,a;
	scanf("%d %d",&p,&a);
	int mod=0,flag=0;
	for(x=0;x<p;x++){
		mod=(2*x+1+mod)%p;
		if(mod==a){
			flag=1;
			printf("%d ",x+1);
		}
	}
	if(flag==0) printf("No Solution");
	return 0;
}

上一题