您的位置:首页 > 其它

【BZOJ4544】椭圆上的整点 数学

2016-05-16 21:43 465 查看
圆上的整点那道题稍稍修改一下就好了。。。不过听说有很神奇的积性函数做法%%%

#全程LL慢如狗系列

/**************************************************************
Problem: 4544
User: RicardoWang
Language: C++
Result: Accepted
Time:28488 ms
Memory:24712 kb
****************************************************************/

#include<cstdlib>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
long long R,A[3000005],ans;
long long Find(long long x)
{
int id=lower_bound(A+1,A+1+3000000,x)-A;
if(A[id]==x)return id;
else return 0;
}
long long GCD(long long x,long long y)
{
long long t;
while(y)
{
t=x%y; x=y; y=t;
}
return x;
}
void run(long long n)
{
long long sb,b;
for(long long a=1;A[a]*3<n;a++)
{
sb=n-3*A[a];
if(b=Find(sb))
{
if(A[a]*3>A[b] && GCD(3*a,b)==1)
{
ans++;
}
}
}
for(long long a=1;A[a]<n;a++)
{
sb=n-A[a];
if(sb%3==0 && (b=Find(sb/3)) )
{
if(A[a]>3*A[b] && GCD(a,b*3)==1)
{
ans++;
}
}
}
return ;
}
int main()
{
//freopen("in.txt","r",stdin);
int T;
for(long long i=1;i<=3000000;i++)A[i]=i*i;
scanf("%d",&T);
while(T--){
cin>>R; R=R*2;

ans=0;
for(long long d=1;d*d<=R;d++)if(R%d==0)
{
run(d);
if(d*d!=R) run(R/d);
}
ans=ans*4+2;
if((R/2)*(R/2)%3==0 &&  Find((R/2)*(R/2)/3))ans+=2;
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: