先预处理0~p-1 的平方除以p的余数。然后要使两数和 的余数是 k 只有两种可能, a+b=k 或者 a+b=p+k
枚举余数的情况,就行了。
#define FOR(i,n) for(long long (i)=1;(i)<=(n);(i)++)
#define For(i,n) for(long long (i)=0;(i)<(n);(i)++)
using namespace std;
int r[1000000];
int k,p;
int main(void)
{
For(i,1000000) r[i]=-1;
while(cin>>k>>p){
For(i,p){
int D=(int)((i*i)%p);
if(!~r[D]){
r[D]=i;
}
}
if(~r[0]&&~r[k]){
printf("%d %d\n",r[0],r[k]);
continue;
}
int T=0;
for(int i=1;i<k;i++){
if(~r[i]&&~r[k-i]){
printf("%d %d\n",r[i],r[k-i]);
T=1;break;
}
}
if(T) continue;
for(int i=k+1;i<=p-1;i++){
if(~r[i]&&~r[p+k-i]){
printf("%d %d\n",r[i],r[p+k-i]);
T=1;break;
}
}
if(T) continue;
printf("NO SOLUTION\n");
}
return 0;
}