2021牛客暑期多校训练营3

首先,没有爆0!没有爆0!!没有爆0!!! 差点G了

E Math

首先这道题,没有看懂题目。
原来x2+y2|k(xy+1)的意思是前面可以整除后面???????? 我直接%&¥%*#%(开玩笑)
队友还是是或的意思,人麻了。不过好像公式写反了。自己看原题吧,懒得改了。

Math光速入口!

一开始在手算想要找规律,在进行了十分钟无用功之后忽然想到为啥不用计算机打表,哪怕是打前面的数值较小的表也可以。。

然后就对着若大的一些表看找规律。

大概就相当于
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;
}
上一篇:一元稀疏多项式计算器(Java)


下一篇:【摸鱼神器】UCode Cms管理系统 内置超好用的代码生成器 解决多表连接痛点