www.rqnoj.cn/Problem_296.html
我这个算法的复杂度应该是LogN*Sqrt(N)..居然AC了囧。。。
这题就是求x*x%n==1的解的个数,
也就是n|(x+1)(x-1)..设n=a*b,a<b,枚举a,那么可以考虑a|x+1&&b|x-1的情况,还有一个是对称的,这种情况下,按b的倍数枚举x,由于b>Sqrt(N)。。故最多Sqrt(N)个x,然后用个set去重就OK了。。
Code:
#include <vector>
#include <algorithm>
#include <utility>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <set>
#define rep(i,n) for(int i=0;i<n;i++)
#define pb push_back
const int inf=~0U>>1;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
//freopen("in","r",stdin);
ll n;cin>>n;set<int> S;
for(int a=1;a*a<=n;a++)
if(n%a==0)
{
int b=n/a;
for(int x=1;x<n;x+=b)
if((x+1)%a==0)
S.insert(x);
for(int x=b-1;x<n;x+=b)
if((x-1)%a==0)
S.insert(x);
}
for(set<int>::iterator i=S.begin();i!=S.end();i++)
cout<<*i<<endl;
}
大神。。貌似2000000000的时候爆掉了。。