求调
查看原帖
求调
553501
可爱的小棉羊楼主2024/9/24 15:55
#include<bits/stdc++.h>
using namespace std;
#define ll __int128
int t;
long long A,B,C;
long long ans=0;
__int128 fpow(__int128 a,ll b){
	__int128 ans=1;
	while(b){
		if(b&1){
			if(ans>1e18/a)return (ll)2e18;
			ans*=a;
		}
		a=a*a;
		b>>=1;
	}
	return ans;
}
vector<long long >vec[70],vec2[70];
ll gcd(ll x,ll y){
	return y? gcd(x,x%y):x;
}
__int128 res[70][1000005];
void work(){
	cin>>A>>B>>C;
	ans=C;
	
	for(int i=1;i<=64;i++){
		ll l=1,r=1e18;
		while(l<r){
			ll mid=(l+r+1)>>1;
//			cout<<(long long)l<<" "<<(long long)r<<"\n";
			if(mid<=min(A,C/i)&&fpow(mid,i)<=B)l=mid;
			else r=mid-1;
		}
		if(l==1)break;
		ans+=l-1;
	}
	
	for(int i=1;i<=64;i+=2){
		ll l=1,r=1e9;
		while(l<r){
			ll mid=(l+r+1)>>1;
			if(mid*mid<=min((ll)A,(ll)C*2/i)&&fpow(mid,i)<=B)l=mid;
			else r=mid-1;
		}
		ans+=r/2;
	}
//	cout<<ans<<"\n";
	for(int i=3;i<=64;i++){
		for(int j=1;j<=64;j++){
			if(gcd(i,j)>1)continue; 
			int l=-1,r=vec[i].size()-1;
			ll up=min((ll)A,(ll)(min((double)C*1.0/j*i,1e18)));
//			for(K=1;K<=1e6;K++){
//				if(fpow(K,i)<=up&&fpow(K,j)<=B)continue;
//				break;
//			}
//			K--;
			while(l<r){
				int mid=(l+r+1)>>1;
//				cout<<vec[i].size()<<" "<<mid<<"\n";
				if(fpow(vec[i][mid],i)<=up&&fpow(vec[i][mid],j)<=B)l=mid;
				else r=mid-1;
			}

			if(r==-1)break;
//			cout<<"happy\n";
			ans+=r+1;
//			cout<<r+1<<'\n';
		}
	}
	cout<<ans<<"\n";
}

void init(){
	for(int i=3;i<=64;i++){
		for(ll j=2;j<=1e6;j++){
			ll v=fpow(j,i);
//			res[i][j]+=res[i][j-1];
			if(v>=1e18)break;
			vec[i].push_back(j);
			vec2[i].push_back(v);
//			if(v%i==0)res[i][j]++;
		}
	}
}
int main(){
//	ios::sync_with_stdio(0);
	cin>>t;
	init();
	while(t--)work();
	
	return 0;
}

2024/9/24 15:55
加载中...