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;
}

 

posted on 2014-04-01 12:11  BLADEVIL  阅读(287)  评论(0编辑  收藏  举报