X^2 Mod P(51Nod-1014)

题目

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

输入

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

输出

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

输入样例

13 3

输出样例

4 9

思路:

由于给定 p 和 a,假设 x 存在,那么 x 的个数为 2 个,即:x1、x2

由于 x1*x1-x2*x2=n*p,那么:x1+x2=p,即 x1、x2 互补

考虑 a 是否完全平方数即可,当 a 不为完全平方数时,那么就可以排除 0~p 取整后的数据

因此需要枚举(p 的开方数取整后+1)~(p/2 取整)

故暴力即可

源程序

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define E 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD=7;
const int N=1000000+5;
const int dx[]= {-1,1,0,0};
const int dy[]= {0,0,-1,1};
using namespace std;
LL a[N];
int main(){
    LL p,a;
    scanf("%lld%lld",&p,&a);

    int i=0;
    bool flag=true;
    while(true){
        double x1=sqrt(i*p*1.0+a*1.0);
        int x2=(int)x1;
        if(x2>p)
            break;

        if(x1==x2){
            printf("%d ",x2);
            flag=false;
        }
        i++;
    }
    if(flag)
        printf("No Solution");
    return 0;
}

 

posted @ 2022-09-20 22:56  老程序员111  阅读(29)  评论(0)    收藏  举报