标签:
题意非常的简单,$x^{2}\equiv 1\left ( mod n \right )$在$\left [ 1,n\right )$上的所有解
转化一下:$x^{2}= k×n+1$
$x^{2}-1=k×n$
$(x+1)(x-1)=k×n$
所以令$x+1=k‘×n‘,x-1=k‘‘×n‘‘$满足$k‘×k‘‘=k,n‘×n‘‘=n$
那么求出n的约数,枚举大于$\sqrt n$的约数并判断即可
答案会有重复,需要去重,这里应用set
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<set> using namespace std; int n,gn; int ys[44722],zz; set<int>ans; int main() { scanf("%d",&n); gn=sqrt(n); for (int i=1; i<=gn; i++) if (!(n%i) && !(n%(n/i))) ys[++zz]=n/i; // for (int i=1; i<=zz; i++) printf("%d ",ys[i]); for (int i=1; i<=zz; i++) for (long long j=ys[i]; j<=n; j+=ys[i]) { if (!((j+2)%(n/ys[i]))) ans.insert(int(j+1)%n); if (!((j-2)%(n/ys[i]))) ans.insert(int(j-1)%n); } if (ans.empty()) puts("None"); else while (!ans.empty()) printf("%d\n",*ans.begin()),ans.erase(ans.begin()); return 0; }
对于set的使用不是很熟练,感谢hjxcpg的几句帮助...TA爷好像有个 密码箱加强版,似乎不可做....待我强大
标签:
原文地址:http://www.cnblogs.com/DaD3zZ-Beyonder/p/5352341.html