显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int maxn=65;
int head[5000+5],eg[100000+5],nxt[100000+5],tot=0,n;
void addedge(int u,int v)
{
eg[++tot]=v;nxt[tot]=head[u];head[u]=tot;
}
int vis[5000+5],mth[5000+5];
bool dfs(int u)
{
for(int i=head[u];i;i=nxt[i]) {
int v=eg[i];
if(!vis[v]) {
vis[v]=true;
if(!mth[v] || dfs(mth[v])) {
mth[v]=u;
return true;
}
}
}
return false;
}
bool jud(int x){return ((int)sqrt(x))*((int)sqrt(x))==x;}
int cal(int N)
{
memset(head,0,sizeof(head));tot=0;
for(int i=1;i<=N;i++)
for(int j=i+1;j<=N;j++) {
if(jud(i+j)) {
addedge(i,j);
}
}
int ans=0;
memset(mth,0,sizeof(mth));
for(int i=1;i<=N;i++) {
memset(vis,0,sizeof(vis));
assert(i<=1600);
if(dfs(i)) ans++;
}
return N-ans;
}
int main()
{
freopen("balla.in","r",stdin);
freopen("balla.out","w",stdout);
scanf("%d",&n);
int L=1,R=1605;
while(L<=R) {
int mid=(L+R)>>1;
if(cal(mid)>n) R=mid-1;
else L=mid+1;
}
printf("%d\n",R);
return 0;
}