首页 > 其他分享 >题解:[春季测试 2023] 幂次

题解:[春季测试 2023] 幂次

时间:2023-11-12 20:23:58浏览次数:42  
标签:return 幂次 int 题解 ll mid sqrt res 2023

题解:[春季测试 2023] 幂次

给定 \(n,k\) ,求有多少个整数 \(i \in [1,n]\) ,满足 \(i=a^b (a,b \in N^+,b \geq k)\)

算法一

\(k \ge 3:\) 发现只需要筛到1e6就没有贡献了,加上 \(set\) 暴力判重即可。

\(k=2:\) 发现有 \(\sqrt{n}\) 个完全平方数,考虑如何避免算重它们。考虑完全平方数的性质。发现有且既有下面两种数是完全平方数:

  1. 一个完全平方数的任意次幂。
  2. 任意一个数的偶次幂。

还是用 \(set\) 判重,加上如上两点判断即可。

最坏时间复杂度为 \(O(10^6 \times log_2^{10^6})\),注意开平方根要用sqrtl或者手写二分

#include<bits/stdc++.h>
#define F(i,l,r) for(ll i=(l);i<=(r);++i)
#define G(i,r,l) for(ll i=(r);i>=(l);--i)
#define ll long long
using namespace std;
set<ll> s;
ll n,k,x,cf;
//inline ll sqrt(ll x){
//	ll l=0,r=1000000010ll,mid;
//	while(l+1<r){
//		mid=(l+r)>>1;
//		if(mid*mid>x) r=mid;
//		else l=mid;
//	} return l;
int main(){
	scanf("%lld %lld",&n,&k);
	if(k==1) return printf("%lld",n),0;
	else if(k>2){
		F(i,2,n){
			x=i*i*i; if(x>n) break;	
			F(j,0,60){
				if(j+3>=k) s.emplace(x);
				if(x>n/i) break;
				x*=i;
			}
		}
		printf("%lld",s.size()+1);
	}
	else{
		ll ans=__builtin_sqrt(n);//要么用sqrtl,要么手写一个longlong的开根(最后一组数据卡精度)
		F(i,2,n){
			if(i*i*i>n) break;
			ll tmp=__builtin_sqrt(i); if(tmp*tmp==i) continue;
			x=i*i,cf=2;
			do{
				++cf,x*=i;
				if((cf&1) && s.find(x)==s.end()) s.emplace(x);
			}while(x<=n/i);
		}
		ans+=s.size();
		printf("%lld",ans);
	}
	return 0;
}

算法二

我们考虑换一种判重方法:

1.对于 \(k \ge 3\) , 若 \(a^x=b^y\), 则有 \(a^x=(a^k)^y\), 那么在以 \(a\) 为底数时就一定能把 以 \(b\) 为底的情况给筛掉,所以我们记 \(vis_i\) 表示 底数 \(i\) 有没有被筛掉,然后就可以愉快地筛起来了。

vis只需要开到 1e6 .

2.对于 \(k=2\), 很明显开不下 vis[1e9], 所以再单独特判一下每个数是不是完全平方数即可。最后加 \(\sqrt{n}\) 个完全平方数,并减去重复的。

时间复杂度近似 \(\sqrt{n}.\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+2;
int n,k,K,m,same=0,sq,ans=0;
bitset<N> b;
int qp(int x,int y){
	int res=1;
	while(y){ if(y&1){ if(res>n/x) return n+1; res=res*x; }y>>=1,x*=x; }
	return res;
}
signed main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>n>>K; if(K==1) return cout<<n,0;
	sq=__builtin_sqrtl(n),k=max(K,3ll);
	int l=0,r=1e6+2,mid;
	while(l+1<r) mid=(l+r)>>1, (qp(mid,k)<=n) ? l=mid : r=mid;
	for(int i=2;i<=l;++i){
		if(b[i]) continue;
		int z=i,o=0;
		while(z<=n){
			o++; 
			if(z<=l) b[z]=1;//标记 
			if(o>=k) ans++;//累计答案 
			if((int)sqrt((int)z)*(int)sqrt((int)z)==(int)z&&o>2) same++;//容斥(去重) 
			if(z>n/i) break;//判超界 
			z*=i;
		}
	}
	if(K==2) ans=ans+sq-1-same;
	cout<<ans+1;
	return 0;
}

标签:return,幂次,int,题解,ll,mid,sqrt,res,2023
From: https://www.cnblogs.com/superl61/p/17827092.html

相关文章

  • 2023-2024-1 20231306 《计算机基础与程序设计》第七周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2023-2024-1计算机基础与程序设计第七周作业这个作业的目标数组与链表、基于数组和基于链表实现数据结构、无序表与有序表、树、图、子程序与参数......
  • 2023-2024-1 20231301 《计算机基础与程序设计》第七周学习总结
    2023-2024-120231301《计算机基础与程序设计》第七周学习总结作业信息作业链接作业课程<班级>(2023-2024-1-计算机基础与程序设计)作业要求<作业>(2023-2024-1计算机基础与程序设计第七周学习总结)作业目标<《计算机基础与程序设计》预习第八章>《计算机基础......
  • 2023-2024-1 20231420 《计算机基础与程序设计》第七周学习总结
    2023-2024-120231420《计算机基础与程序设计》第七周学习总结作业信息这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业要求在哪里2023-2024-1计算机基础与程序设计第七周作业这个作业的目标1.学习《计算机科学概论》第8章并完成云班课测试;2.......
  • 2023-2024-1 20231321 《计算机基础与程序设计》第7周学习总结
    2023-2024-120231321《计算机基础与程序设计》第7周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2023-2024-1计算机基础与程序设计第7周作业)这个作业的目标<计算机科学概论第8......
  • 2023.11.2测试
    \[\text{NOIP模拟赛-2023.11.12}\]T1马有\(n\)匹马,\(m\)个人来骑马。有三个项目,分别是骑小圈、骑大圈、过河,三个项目对马的疲劳值的影响分别是\(+20,+50,\times2\)。初始时每匹马的疲劳值是\(1\),且每匹马的疲劳值不能超过\(100\)。给定每个项目的人数\(c_1,c_2,c_3(c_1......
  • 2023-2024-1 20231323《计算机基础与程序设计》第七周学习总结
    2023-2024-120231323《计算机基础与程序设计》第七周学习总结作业信息所属课程2023-2024-1-计算机基础与程序设计作业要求在哪里2023-2024-1计算机基础与程序设计第七周作业作业目标数组与链表,基于数组和基于链表实现数据结构,无序表与有序表,树(tree),图(Graph),子程序......
  • 2023.11.10测试
    \[\text{NOIP模拟赛-2023.11.10}\]T1进步科学一棵以\(1\)为根的\(n\)个点的树,初始时所有点的点权都是\(0\),每个点有期望的点权(\(0\)或\(1\))。每次操作可以选择一个点\(i\)变化它的点权,这个操作效果会在一秒后传给它的父亲,在\(j\)秒后传给它的\(j\)级祖先。特别的,......
  • #2023-2024-1 20232322 《#2023-2024-1 20232322 《网络》第一周学习总结
    教材学习内容总结教材学习中的问题和解决过程-问题1:为何针对网络空间的攻击难以防范-问题1解决方案:一.攻击手段复杂多样:网络攻击者利用各种漏洞和恶意代码,以各种方式进行攻击,包括病毒、蠕虫、木马、勒索软件、拒绝服务攻击等。二.威胁来源难以确定:网络攻击往往来自于未知的I......
  • KubeSphere 社区双周报 | KubeSphere 3.4.1 发布 | 2023.10.27-11.09
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2023.10.27-2023.11.09。贡献者名单新晋KubeSphereCon......
  • Tenzing and Random Operations CF1842G 题解
    设\(m\)次选的位置分别为\(b_{1\simm}\)。于是答案为\(\mathbbE(\prod\limits_{i=1}^{n}(a_i+\sum\limits_{j=1}^{m}[b_j\lei]\cdotv))=\frac{S}{n^m}\)。首先考虑期望很难做,希望将期望转化为概率形式,发现这样有点困难。再考虑因为所有方案等概率,将求期望转化......