大致思路与当下第二篇题解相同,但不明白到底哪错了,拿来自己测了几个数据发现答案一致,求dalao帮忙看看
#include<bits/stdc++.h>
#define MAXN 1000010
#define int __int128
#define mp(x,y) make_pair(x,y)
#define raed() read()
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,l,r) for(int i=l;i>=r;i--)
#define lowbit(x) (x&(-x))
#define ll(x) (x<<1)
#define rs(x) (x<<1|1)
#define inf 0x3f3f3f3f
#define mod 998244353
#define PI 3.1415926535
using namespace std;
inline int read()
{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
inline void write(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
return;
}
inline int quick(int a,int x)
{
int ans=1;
while(x)
{
if(x%2) ans=ans*a;
if(ans>(int)(1e18))
return -1;
a=a*a;
x>>=1;
}
return ans;
}
int n,k;
inline int get_other(int x,int y)
{
int now=quick(x,y);
rep(i,k,y-1)
{
int l=x+1;
int r=mod;
while(l<=r)
{
int mid=(l+r)>>1;
int u=quick(mid,i);
if(u==now)
return 1;
else if(u<now&&u>0)
l=mid+1;
else r=mid-1;
}
}
return 0;
}
inline void solve()
{
n=read();
k=raed();
if(k==1||n==1)
{
write(n);
return;
}
int ans=0;
if(k==2)
{
int l=1;
int r=n;
while(l<=r)
{
int mid=(l+r)>>1;
if(mid*mid>n)
r=mid-1;
else
{
ans=mid;
l=mid+1;
}
}
ans--;
}
rep(i,max(k,(int)3),64)
{
if(quick(2,i)>n||quick(2,i)<=0)
break;
int l=2;
int r=n;
int now=2;
while(l<=r)
{
int mid=(l+r)>>1;
if(!(quick(mid,i)>0&&quick(mid,i)<=n))
r=mid-1;
else
{
now=mid;
l=mid+1;
}
}
rep(j,2,now)
if(!get_other(j,i))
ans++;
}
write(ans+1);
return;
}
signed main()
{
int T=1;
while(T--)
solve();
return 0;
}