清北学堂济南刷题班day1

.。。这算什么。。

一坑未填 再开一坑。。

求勿喷

本人蒟蒻。。。写博客纯粹为了理思路。。。


D1T1

立方数(cubic)

Time Limit:1000ms   Memory Limit:128MB

 

题目描述

LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8,27就是最小的3个立方数。

现在给定一个数P,LYK想要知道这个数是不是立方数。

当然你有可能随机输出一些莫名其妙的东西来骗分,因此LYK有T次询问~

 

输入格式(cubic.in)

第一行一个数T,表示有T组数据。

接下来T行,每行一个数P。

 

输出格式(cubic.out)

输出T行,对于每个数如果是立方数,输出“YES”,否则输出“NO”。

 

输入样例

3

8

27

28

 

输出样例

YES  

YES

NO

 

数据范围

对于30%的数据p<=100。

对于60%的数据p<=10^6。

对于100%的数据p<=10^18,T<=100。


看到这一题 毫无疑问是枚举 但是 最多p开三次方 最多只有10^6 也就是说要枚举 10^6*10^2次 毫无疑问 是超的 那么,有一种简单的方法,计算机做不了的事 人脑可以来帮忙(22333),将1000000手动“”十分“”分成十个区间来判断枚举, 手动将1个10给优化掉,代码如下

#include<iostream>
using namespace std;
//ifstream in("cubic.in");
//ofstream out("cubic.out");
unsigned long long a[100];
unsigned long long ans=0,k=0,n,x,flag=0;
int main()
{
	//freopen("cubic.in","r",stdin);
	//freopen("cubic.out","w",stdout);
	long int i,j,p;
	a[1]=1;
	for(i=2;i<=10;i++)
	a[i]=(long long)(i-1)*100000*(i-1)*100000*(i-1)*100000;
	cin>>n;
	for(i=1;i<=n;i++)
	{
	flag=0;
	cin>>x;	
	for(j=10;j>=1;j--)
	if(a[j]<=x)
	{
	k=j;
	break;	
	}
	if(k==1)
	{
		for(p=1;p<=100000;p++)
			if(x==(long long)p*p*p)
			{
			cout<<"YES"<<endl;	
			flag=1;
			break;			
			}		
	}
	else {
		for(p=(k-1)*100000;p<=k*100000;p++)
			if(x==(long long)p*p*p)
			{
			cout<<"YES"<<endl;	
			flag=1;
			break;			
			}
	}
	if(flag==0)
	cout<<"NO"<<endl;
	}
	//in.close();
	//out.close();
	return 0;
}


D1T2

立方数2(cubicp)

Time Limit:1000ms   Memory Limit:128MB

 

题目描述

LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8,27就是最小的3个立方数。

LYK还定义了一个数叫“立方差数”,若一个数可以被写作是两个立方数的差,则这个数就是“立方差数”,例如7(8-1),26(27-1),19(27-8)都是立方差数。

现在给定一个数P,LYK想要知道这个数是不是立方差数。

当然你有可能随机输出一些莫名其妙的东西,因此LYK有T次询问~

这个问题可能太难了…… 因此LYK规定P是个质数!

 

输入格式(cubicp.in)

第一行一个数T,表示有T组数据。

接下来T行,每行一个数P。

 

输出格式(cubicp.out)

输出T行,对于每个数如果是立方差数,输出“YES”,否则输出“NO”。

 

输入样例

5

2

3

5

7

11

 

输出样例

NO

NO

NO

YES

NO

 

 

数据范围

对于30%的数据p<=100。

对于60%的数据p<=10^6。

对于100%的数据p<=10^12T<=100。


看到这一题,肯定会想到立方差公式 a^3-b^3=(a-b)*(a^2+a*b+b^2) 又因p为质数 且后面的那一项显然大于前一项 所以 p必等于a^2+a*b+b^2
又可得 b=a-1 代换可得 p=3*a^2-3*a+1 之后枚举判断即可
#include<iostream>
using namespace std;
//ifstream in("cubicp.in");
//ofstream out("cubicp.out");
long long flag=0,x,n,sum=0;
int main()
{
	//freopen("cubicp.in","r",stdin);
	//freopen("cubicp.out","w",stdout);
	long long i,j;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		flag=0;
		sum=0;
		cin>>x;
		for(j=1;j<=100001;j++)
		{
		sum=3*j*j-3*j+1;
		if(sum==x)
		{
		cout<<"YES"<<endl;	
		flag=1;		
		break;
		}			
		}
		if(flag==0)
		cout<<"NO"<<endl;
	}
	//in.close();
	//out.close();
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值