[数学] BZOJ 4544 椭圆上的整点
2016-04-19 12:29
260 查看
和 bzoj1041 圆上整点很类似
只要把A改为3*a*a枚举就行了 这种暴力233跑得太慢
只要把A改为3*a*a枚举就行了 这种暴力233跑得太慢
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long ll; inline ll Jud(ll x){ ll isqr=sqrt(x); if (isqr*isqr==x) return isqr; return -1; } ll N,ans; ll Gcd(ll a,ll b){ if (a<b) return Gcd(b,a); return b?Gcd(b,a%b):a; } inline void Calc(ll d){ ll c=2*N/d,a,b,A,B; for (b=1;b*b<=c;b++) if ((c-b*b)%3==0 && (a=Jud((c-b*b)/3))>0) { A=3*a*a; B=b*b; if (A!=B && Gcd(A,B)==1) if ((B-A)%2==0 || d%2==0) { // ll X=abs(B*d-A*d)>>1,Y=Jud(A*B*d*d/3); ans++; } } } int main() { ll d,Q; freopen("t.in","r",stdin); freopen("t.out","w",stdout); scanf("%lld",&Q); while (Q--) { ans=0; scanf("%lld",&N); N=abs(N); if (N==0) { printf("1\n"); continue; } for (d=1;d*d<2*N;d++) if (2*N%d==0) Calc(d),Calc(2*N/d); if (d*d==2*N) Calc(d); ans*=4; ans+=2; if (N%3==0 && Jud(N*N/3)!=-1) ans+=2; printf("%lld\n",ans); } return 0; }
相关文章推荐
- C++ WINDOWS API 如何使用NMAKE和CL编译
- 136. Single Number
- <Pro WPF 4.5 in C#> - Note-02
- EAS性能优化
- android edittext 去边框 去下划线
- web页面记住密码存在安全问题 - 处理方式
- 26Sudoku Killer
- java开发学习工具,必须收藏
- oracle基础实战笔记
- php命名空间的设计思想和缺点
- [线段树]分数修改
- Linux共享Windows文件夹
- 将retrofit2和rxjava的初始化配置到application
- 【Leetcode】:238. Product of Array Except Self 问题 in JAVA
- 1017
- ES配置文件
- Qt 使用statusBar来显示程序打印信息
- RecyclerView解决加载和刷新
- (LeetCode 299) Bulls and Cows (HashTable)
- MS SQL执行大脚本文件时,提示“内存不足”的解决办法