题目:
示例1
输入
10
10
100
1000
10000
100000
114514
1919810
20190104
123123123123
10000001000000
输出
2
5
14
31
65
67
158
326
5226
22091
说明:
指xy+1可以被x2+y2整除
思路:
打表找规律:
先打个10000的表:
代码:
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
for(int i=1;i<=10000;i++){
for(int j=1;j<=10000;j++){
if((i*i+j*j)%(i*j+1)==0&&i<=j)
printf("%d %d\n",i,j);
}
}
return 0;
}
整理可得:
发现从第二行开始,每一行递增关系均满足:
此关系;
所以可以先将全部数据存入数组中,然后进行排序,二分查找合适的位置进行相加即可得到最终的答案;
注意用:__int128
unsigned long long过不了我也不知道为什么呜呜呜呜呜呜呜……
代码:
#include <bits/stdc++.h>
#define ll long long
typedef unsigned long long ull;
using namespace std;
const int N=1e7+10;
__int128 a[N];
int main()
{
int t;
scanf("%d",&t);
__int128 c,rear,num=0;
a[num++]=1;
for(ll i=2;i<=1000000;i++){
c=i*i*i,rear=i;
while(c<=1e18){
a[num++]=c;
__int128 cmp=c;
c=i*i*c-rear;
rear=cmp;
}
}
sort(a,a+num);
while(t--){
ll n;
cin>>n;
int ans=lower_bound(a, a+num,n)-a;
if(a[ans]==n)ans++;
cout<<ans<<endl;
}
return 0;
}