.。。这算什么。。
一坑未填 再开一坑。。
求勿喷
本人蒟蒻。。。写博客纯粹为了理思路。。。
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^12,T<=100。
#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;
}