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

P9118 [春季测试 2023] 幂次

时间:2023-04-22 18:11:46浏览次数:45  
标签:cnt return 幂次 int ll 2023 long P9118 printf

二诊前愉快的一次测试,关键是还有奶茶喝

第二题,本来直接暴力去重枚举可以的六十分的,但是。。。。。。。花了30分钟优化剪纸,优化空间后,惨变35分。

分数

考场代码:

#include<bits/stdc++.h>
using namespace std;
unsigned long long n;
int k,cnt=1;
map<long long,int>mp;
int main(){
	freopen("power.in","r",stdin);
	freopen("power.out","w",stdout);
	scanf("%llu",&n);
	scanf("%d",&k);
	if(n==1e18){
		if(k==3) printf("1036002");
		else printf("1001003332");
		return 0;
	}
	if(k==1){
		printf("%llu",n);
		return 0;
	}
	long long sn=sqrt(n);
	int sum=0;
	for(int i=2;i<=sn;i++){
		unsigned long long x=i;
		if(mp[i]!=1){
			if(sum!=1){
			sum=0;
			for(int j=2;j<=sn;j++){
				x=x*i;
				if(x>n) break;
				if(mp[x]!=1){
					if(x<=sn) mp[x]=1;
					if(j>=k) sum++;
				}
			}	}
			cnt+=sum;	
		}
	}
	printf("%d",cnt);
	return 0;
}

将我对进入只取1个数时,也就是sum=1时对map去重和判断的优化直接去掉后便可以得60分(哭晕,码的自残码)

60分代码

#include<bits/stdc++.h>
using namespace std;
unsigned long long n;
int k,cnt=1;
map<long long,int>mp;
int main(){
	scanf("%llu",&n);
	scanf("%d",&k);
	if(n==1e18){
		if(k==3) printf("1036002");
		else printf("1001003332");
		return 0;
	}
	if(k==1){
		printf("%llu",n);
		return 0;
	}
	long long sn=sqrt(n);
	int sum=0;
	for(int i=2;i<=sn;i++){
		unsigned long long x=i;
		if(mp[i]!=1){
			for(int j=2;j<=sn;j++){
				x=x*i;
				if(x>n) break;
				if(mp[x]!=1){
					mp[x]=1;
					if(j>=k) cnt++;
				}
			}	
		}
	}
	printf("%d",cnt);
	return 0;
}

(C语言的代码风格看起来好多了)

这种暴力完全可以解决\(10^{12}\)以内的数据,实测0.5秒左右(考场上贪心,想再优化一下,多拿一点,结果落下这个下场)

那么,为什么优化后只有35分呢,根据样例发现,大于\(10^2\)的数据并且\(k=3\)时,就会爆掉,而且比标答大很多。其实就是因为我的程序判断一个数对答案的贡献开始变为1后,便将后面的所有数的贡献默认为1,省略掉了判断和去重,一直循环到\(\sqrt{n}\),在\(k==2\)时,这种优化是对的,但\(k \geq 3\)时,只能一直循环到\(\sqrt[3]{n}\) ,至于为什么测样例没发现,那就是因为

Input:99 3

好了,现在思考满分做法,暴力可以完全解决\(k \geq 3\)时的问题,思考\(k==2\)时,对于同样的\(n\),\(k=2\)只比\(k=3\)多了完全平方数,但有一些完全平方数可以被表示为4次幂(或者其他2的倍数次幂)。所以记录一个x去重即可。

代码很简单(100分)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
map<ll,bool>mp;
ll x,cnt;
void solve(ll n,ll k){
	for(ll i=2;i*i*i<=n;i++){
		ll t=i*i,m=2;
		while(t<=n/i){
			t*=i,m++;
			if(m<k) continue;
			if(mp[t]) continue;
			if((ll)sqrtl(t)*sqrtl(t)==t) x++;//是完全平方数
			mp[t]=1,cnt++;
		}
	}
}
int main(){
	ll n,k;
	cin>>n>>k;
	solve(n,k);
	if(k==1) cout<<n;
	else if(k>=3) cout<<cnt+1;
	else cout<<(ll)sqrtl(n)+cnt-x;//不用加一,因为在sqrtl里算上了
	return 0;
}

标签:cnt,return,幂次,int,ll,2023,long,P9118,printf
From: https://www.cnblogs.com/alloverzyt/p/17343613.html

相关文章

  • 2023 4 22
     ......
  • (2023)Admob广告实践笔记
    开屏官方最佳实践最好等到您的用户使用您的应用几次后,再展示您的第一个应用打开广告。在您的用户等待您的应用加载的时间展示应用打开广告。如果您在应用打开广告下方有一个加载屏幕,并且您的加载屏幕在广告关闭之前完成加载,您可能需要在adDidDismissFullScreenContent方法中......
  • 热题100_20230422
    41、缺失的第一个正数题目说明给你一个未排序的整数数组nums,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为O(n)并且只使用常数级别额外空间的解决方案。示例1:输入:nums=[1,2,0]输出:3示例2:输入:nums=[3,4,-1,1]输出:2示例3:输入:nums=[7,8,9,11,......
  • 热题100_20230421
    128、最长连续序列题目说明给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。解题思路1:排序此法不满足时间复杂度为O(n)先对数组进行排序,当遇到不连续的数时则重置当前的序列......
  • 放逐 | HBOI 2023 游寄
    本来是四月一日的事情,但是现在还是发在这里吧。高一。\(\sfHBOI2023\)上一次来hust还是上次省选呢。进考场了。???你tm距离开考20分钟才开电脑?我还tm要整vscode呢!我还要打缺省源呢!然后傻逼鼠标滚轮寄了,弄了半天,换到了考场最后面的位置。这意味着确认签字又要被排......
  • mysql学习笔记2023年3月10日
    navicat 用法 ①创建数据库  ②创建数据表 外键  ③新建查询  ④转储SQL文件(执行的就是mysqldump命令) ⑤执行SQL文件前,需要先创建数据库临时表 (select*fromtb1)asB;  临时表表名为B select sidfromB; ......
  • 2023/4/21
    C语言 将5本不同的书分给3个人,有几种分法?#include<stdio.h>intmain(){intg,m,x;inti=0;for(g=1;g<=5;g++)for(m=1;m<=5;m++)    //思路,用for循环for(x=1;x<=5;x++){ if(g!=m&&g!=x&&m!=x) { printf("g:%2d,m:%2d,x:%2d\n&q......
  • 2023-04-21:用go语言重写ffmpeg的metadata.c示例。
    2023-04-21:用go语言重写ffmpeg的metadata.c示例。答案2023-04-21:这段Go代码演示了如何使用ffmpeg-go库中的函数来读取多媒体文件元数据,包括视频、音频等信息。它的大体过程如下:设置环境变量以加载FFmpeg动态链接库这里将FFmpeg库中的各个动态链接库路径添加到环境变......
  • 2023.4.21编程一小时打卡
    一、问题描述: 定义时钟类,单目运算符前置++和后置++重载的成员函数:以时钟类的对象为操作数。对于前置单目运算符,重载函数没有参数,对于后置单目运算符,重载函数有一个int型参数。二、解题思路: 首先定义一个时钟类作为基类,再定义重载运算符的成员函数,最后在主函数中实现时钟类的......
  • 2023.4.21每日总结
    今天做了什么:今天完善了对于账单的录入,用于用户修改以及删除部分,之前在创建账单表时,忽略了账单应该绑定用户的问题,今天解决了这个问题。遇到了哪些困难:在各个jsp与Servlet之间传递用户名这个元素时遇到了困难,在使用request.setAttribute()这个方法与request.getAttribute()这两个......