bzoj 1406
%%% PoPoQQQ
x^2=kn+1
x^2-1=kn
(x+1)(x-1)=kn
令x+1=k1*n1,x-1=k2*n2,其中k1k2=k,n1n2=n
因此我们可以枚举n的约数中所有大于等于$\sqrt{n}$的,分别作为n1和n2代入验证.
这么水的题我竟然没想出来TAT
复杂度$\sum_{d|n\&\&d<=\sqrt n}d$
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<set> 6 #define N 500005 7 using namespace std; 8 int ans[N],top; 9 set<int>s; 10 int main() 11 { 12 int n;scanf("%d",&n); 13 for(int i=1;i*i<=n;i++) 14 { 15 if(n%i==0) 16 { 17 int t=n/i; 18 for(int j=0;j<=n;j+=t) 19 { 20 if((j+2)%i==0)s.insert(j+1); 21 if(j>=2&&(j-2)%i==0)s.insert(j-1); 22 } 23 } 24 } 25 if(!s.size())puts("None\n"); 26 set<int>::iterator i; 27 for (i=s.begin();i!=s.end();i++)if(*i<n)printf("%d\n",*i); 28 return 0; 29 }