10pts求调
查看原帖
10pts求调
210915
bluedoor418楼主2023/3/11 12:00

大致思路与当下第二篇题解相同,但不明白到底哪错了,拿来自己测了几个数据发现答案一致,求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;
}
2023/3/11 12:00
加载中...