Math
题目描述
Given n, count the number of pairs of positive integers (x, y), such that xy+1∣x2+y2,1≤x≤y≤nxy+1|x^2+y^2, 1\le x\le y \le nxy+1∣x2+y2,1≤x≤y≤n.
There're t test cases in total.
输入描述:
First line contains an integer t(1≤t≤105)t (1\le t\le 10^5)t(1≤t≤105). Next t lines each contains one integer n (1≤n≤1018)(1\le n \le 10^{18})(1≤n≤1018).
输出描述:
Output t lines, denoting the answer of each testcase.
示例1
输入
复制
10
10
100
1000
10000
100000
114514
1919810
20190104
123123123123
10000001000000
输出
复制
2
5
14
31
65
67
158
326
5226
22091
思路:
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 1e18;
ll p[5000010],n,cnt;
int main(){
p[cnt++]=1;
for(ll i=2;i*i*i<=maxn;i++){
ll x=i,y=i*i*i;
p[cnt++]=y;
while(y<=(maxn+x)/i/i){//新的y与原来的x的和为i*i*y
x=i*i*y-x;
swap(x,y);
p[cnt++]=y;
}
}
sort(p,p+cnt);//排序
int t;
cin>>t;
while(t--){
cin>>n;
cout<<upper_bound(p,p+cnt,n)-p<<endl;//二分查找
}
return 0;
}