毒瘤
打表找规律
为什么Claris大神选择了506
原因是对于506以上的
绝对单调
第二问不必统计答案
#include<bits/stdc++.h>
const int N=507;
using namespace std;
typedef long long ll;
ll n,l=12,r=1442250,mid,t,ans;
int i,j,v[N]={},sum[N]={};
int f[N]={0,1,0,0,2,2,0,0,0,3,3,0,0,3,3,0,4,4,0,0,4,4,0,0,0,4,4,0,0,4,4,0,0,0,5,5,6,6,5,5,6,5,5,0,0,5,5,0,0,6,5,5,6,6,5,5,6,6,7,7,0,6,6,7,8,6,6,0,8,7,6,6,0,8,6,6,0,6,6,7,8,6,6,7,7,7,6,6,7,7,6,6,0,8,7,7,0,9,7,7,7,7,7,7,7,7,7,9,0,8,7,7,0,8,7,7,8,8,8,7,7,8,8,7,7,8,7,7,0,8,7,7,9,8,8,7,7,9,8,7,7,8,8,8,9,8,8,8,8,8,8,8,8,8,8,8,9,10,8,8,9,9,8,8,8,8,8,8,8,8,8,9,9,10,8,8,9,10,8,8,9,9,9,8,8,9,9,8,8,10,8,8,9,10,8,8,9,9,9,8,8,9,9,8,8,9,9,9,9,10,9,9,9,10,9,9,9,9,10,9,9,9,9,9,9,10,9,9,9,9,9,9,9,9,9,9,9,10,10,9,9,10,10,9,9,9,9,9,9,9,9,9,10,10,10,9,9,11,10,9,9,10,10,10,9,9,10,10,9,9,10,9,9,11,10,9,9,11,10,10,9,9,10,10,9,9,10,10,10,11,10,10,10,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,10,10,10,11,10,10,10,10,11,10,10,10,10,10,10,11,10,10,10,10,10,10,10,10,10,10,10,11,11,10,10,11,11,10,10,10,10,10,10,10,10,10,11,11,11,10,10,11,11,10,10,11,11,11,10,10,11,11,10,10,11,10,10,11,11,10,10,11,12,11,10,10,11,11,10,10,11,11,11,11,11,11,11,11,12,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,12,11,11,11,11,12,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,12,12,11,11,11,11,11,11,11,11,11,12,12,12,11,11,12,12,11,11,12,12,12,11,11,12,12,11,11,12,11,11,12,12,11,11,12,12,12,11,11,12,12,11,11};
ll F(ll x){
return x*(x+1)*(x*2+1)/6;
}
int main(){
scanf("%lld",&n);
for(i=2;i<N;i++)
if(f[i])
for(j=1;j<i;j++)
if(!f[j]||f[j]>f[i])
v[j]=1;
for(i=2;i<N;i++)
sum[i]=sum[i-1]+v[i];
if(n<N){
if(f[n])
printf("%d",f[n]);
else
putchar('-');
printf(" %d",sum[n]);
return 0;
}
while(l<=r){
mid=(l+r)/2;
if(F(mid)>=n){
t=mid;
r=mid-1;
}
else l=mid+1;
}
// while(l<=r)if(F(mid=(l+r)>>1)>=n)r=(t=mid)-1;else l=mid+1;
// printf("%lld ",t+);
if((F(t)>n&&F(t)-n<=128&&!f[F(t)-n])){
cout<<t+1;
}
else cout<<t;
// printf("%lld ",t+(F(t)>n&&F(t)-n<=128&&!f[F(t)-n]));
cout<<" ";
for(ans=(t-12)*31+sum[N-1],i=1;i<=128;i++)
if(!f[i]&&F(t)-i<=n)
ans++;
printf("%lld",ans);
return 0;
}