链接
http://www.lydsy.com/JudgeOnline/problem.php?id=4544
题解
“我真傻,真的,”wyw抬起没有神采的眼睛,接着说。“我单知道这是做过的题目,第二次却还要翻题解。而且调了一整节课”
真是一个悲伤的故事,我太弱了。
y2=13(N−x)(N+x)
令 d=gcd(N−x)(N+x)
y2=13d2(3a2b2)
3a2+b2=2Nd
d(3a2+b2)=N
另外还有 d(a2+3b2)=N 的情况。
复杂度 O(N34) ,这是一个很宽的上界,实际上约数个数平均是远小于 N−−√ 的,所以即使算着 109 还依然能过。
代码
//数学
#include <cstdio>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
inline bool pan(ll x)
{
ll t=sqrt(x);return t*t==x;
}
ll gcd(ll a, ll b){return !b?a:gcd(b,a%b);}
int main()
{
ll d, a, b2, ans, t, N, T;
for(scanf("%lld",&T);T;T--)
{
scanf("%lld",&N);
ans=0;
for(d=1;d*d<=2*N;d++)
{
if(2*N%d!=0)continue;
t=2*N/d;
for(a=1;3*a*a<=t;a++)
{
if(3*a*a*2==t)continue;
b2=(t-3*a*a);
if(pan(b2) and gcd(3*a*a,b2)==1)ans++;
}
if(d*d==2*N)continue;
t=d;
for(a=1;3*a*a<=t;a++)
{
if(3*a*a*2==t)continue;
b2=(t-3*a*a);
if(pan(b2) and gcd(3*a*a,b2)==1)ans++;
}
}
printf("%lld\n",ans*4+2);
}
}