首先,没有爆0!没有爆0!!没有爆0!!! 差点G了
E Math
首先这道题,没有看懂题目。
原来x2+y2|k(xy+1)的意思是前面可以整除后面???????? 我直接%&¥%*#%(开玩笑)
队友还是是或的意思,人麻了。不过好像公式写反了。自己看原题吧,懒得改了。
一开始在手算想要找规律,在进行了十分钟无用功之后忽然想到为啥不用计算机打表,哪怕是打前面的数值较小的表也可以。。
然后就对着若大的一些表看找规律。
大概就相当于
i=2的情况下(2,8)–>(8,30) -->(30,112) -->(112,418) 规律很清晰了有没有
8* 22-2 = 30
3022-8=112
112 22-30=418;
当然 还有i=3,4,5…106 ,为什么是 106呢 因为n最大取值为1018
数据值太大,肯定不能用下标存,直接存数值就好了! 再sort排一个序,搞一个二分查找什么的,完美。(但是我不会写,代码是队友写的,我只有思路 )
哦,对了 要开__int128 听说 1e18也不会爆。
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
//#define int unsigned long long
#define int __int128
#define re int
#define eps 1e-8
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define mk make_pair
#define P pair < int , int >
using namespace std;
const int N=5e6+5;
int a[N];
inline int read()
{
int X=0,w=0; char ch=0;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
}
inline void write(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
void solve()
{
int t=0;
a[++t]=1;
for(int i=2;i<=2000001;i++)
{
int temp1=i*i*i;
int temp2=i;
int temp3=0;
while(1)
{
if(temp1>1e18||temp1<0) break;
a[++t]=temp1;
temp3=temp2;
temp2=temp1;
temp1=temp2*i*i-temp3;
}
}
sort(a+1,a+t+1);
int now;
now=read();
while(now--)
{
int y;
y=read();
int x=upper_bound(a+1,a+t+1,y)-a;
write(x-1);
puts("");
}
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
solve();
// puts("");
}
return 0;
}