【bzoj1406】 AHOI2007密码箱 数论

化简一下式子。

(x+1)(x-1)=k*n

x+1=k1n1 x-1=k2n2   k1k2=k n1n2=n

那么我们枚举n的大于根号n的因子n1,然后枚举一个k1,之后把k1n1分别作为x+1和x-1来求解,看一看求出的另一个是否是n/n1的倍数,注意用set去重。


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#define maxn 2000000000

using namespace std;

set<int> p;
int n;

int main()
{
	scanf("%d",&n);
	for (int i=1;i*i<=n;i++)
	  if (n%i==0)
	  {
	  	int b=n/i;
	  	for (int j=1;j<=n;j+=b) if ((j+1)%i==0) p.insert(j);
	  	for (int j=b-1;j<=n;j+=b) if ((j-1)%i==0) p.insert(j);
	  }
	if (!p.size()) printf("None\n");
	set<int>::iterator i;
	for (i=p.begin();i!=p.end();i++) printf("%d\n",*i);
	return 0;
}


你可能感兴趣的:(【bzoj1406】 AHOI2007密码箱 数论)