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
");
26     set<int>::iterator i;  
27     for (i=s.begin();i!=s.end();i++)if(*i<n)printf("%d
",*i);  
28     return 0;
29 }
原文地址:https://www.cnblogs.com/ezyzy/p/6556339.html