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