bzoj 1406 数论

  首先问题的意思就是在找出n以内的所有x^2%n=1的数,那么我们可以得到(x+1)(x-1)=y*n,那么我们知道n|(x+1)(x-1),我们设n=a*b,那么我们对于任意的a,我们满足n%a==0,我们可以求出b,我们可以使x+1|a,x-1|b,然后我们可以构造所有满足被b整除的数,然后判断是否能被a整除, 然后再枚举x+1|b,x-1|a的情况,假设一组合法解不能拆开后被a,b分别整除,那么对于另外的a,b我们肯定可以再次枚举出这个解,然后对于相同的解用set去下重就可以了。

  反思:手残打错了符号= =。

  

/**************************************************************

    Problem: 1406

    User: BLADEVIL

    Language: C++

    Result: Accepted

    Time:0 ms

    Memory:808 kb

****************************************************************/

 

//By BLADEVIL

#include <cstdio>

#include <set>

 

using namespace std;

 

int n;

 

int main()

{

    set<int>tree;

    scanf("%d",&n);

    for (int a=1;a*a<=n;a++)

        if (!(n%a)) {

            int b=n/a;

            for (int i=1;i<=n;i+=b) if (!((i+1)%a)) tree.insert(i);

            for (int i=b-1;i<=n;i+=b) if (!((i-1)%a)) tree.insert(i);

        }

    set<int>::iterator p;

    if (!tree.size()) 

        printf("None\n"); else

        for (p=tree.begin();p!=tree.end();p++)

            printf("%d\n",*p);

    return 0;

}

 

你可能感兴趣的:(ZOJ)