火題大戰Vol.1 A.
題目描述
給定兩個數\(x\),\(y\),比較\(x^y\) 與\(y!\)的大小。
輸入格式
第一行一個整數\(T\)表示資料組數。
接下來\(T\)行,每行兩個整數\(x\),\(y\),表示\(T\)組資料。
輸出格式
輸出有\(T\)行,對於每一組資料,如果\(x^y \leq y!\)
輸出 \(Yes\),否則輸出\(No\)。
樣例
樣例輸入
3
1 4
2 4
3 4
樣例輸出
Yes
Yes
No
樣例輸入
5
50 100
37 100
200 1000
400 1000
20000 100000
樣例輸出
No
Yes
Yes
No
Yes
資料範圍與提示
對於\(50\%\)的資料滿足\(x \leq 8\),\(y \leq 10\)。
對於\(80\%\)的資料滿足\(x\),\(y \leq 300\) 。
對於\(100\%\)的資料滿足\(x\),\(y \leq 10^5\),\(T \leq 5\)。
分析
做法一:
比較套路,因為我們只需要比較數的大小,所以我們將\(a \times b\)轉化為 \(log(a)+log(b)\)
程式碼
#include<bits/stdc++.h>
using namespace std;
typedef double db;
const double lqs=1e-9;
const int maxn=1e6+5;
db lg[maxn];
int main(){
int t;
scanf("%d",&t);
for(int i=1;i<maxn;i++){
lg[i]=log2(i);
}
while(t--){
int xx,yy;
scanf("%d%d",&xx,&yy);
double ans1=0,ans2=0;
for(int i=1;i<=yy;i++){
ans1=ans1+lg[xx];
}
for(int i=1;i<=yy;i++){
ans2=ans2+lg[i];
}
if(ans1-ans2>lqs) printf("No\n");
else printf("Yes\n");
}
return 0;
}
做法二
壓位高精,但是因為博主比較菜,所以只能得到\(80\)分
程式碼
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
const int bas=1000;
struct bigint{
int a[maxn],len;
bigint(){
memset(a,0,sizeof(a));
len=0;
}
void qk(){
for(int i=1;i<=len;i++) a[i]=0;
len=0;
}
void Read(int aa){
while(aa){
a[++len]=aa%bas;
aa/=bas;
}
}
bigint operator *(const bigint &A)const{
bigint C;
C.len=A.len+len;
for(int i=1;i<=A.len;i++){
for(int j=1;j<=len;j++){
C.a[i+j-1]+=A.a[i]*a[j];
}
}
for(int i=1;i<=C.len;i++){
if(C.a[i]>=bas){
int cz=C.a[i]/bas;
C.a[i+1]+=cz;
C.a[i]%=bas;
}
}
if(C.a[C.len+1]) C.len++;
while(C.a[C.len]==0) C.len--;
return C;
}
void Write(){
for(int i=len;i>=1;i--){
printf("%.4d",a[i]);
}
printf("\n");
}
}ansa,ansb,zh;
int main(){
int t;
scanf("%d",&t);
while(t--){
int xx,yy;
scanf("%d%d",&xx,&yy);
ansa.qk(),ansb.qk();
ansa.Read(xx);
zh.qk();
zh.Read(xx);
for(int i=1;i<yy;i++){
ansa=ansa*zh;
}
ansb.Read(yy);
for(int i=1;i<yy;i++){
zh.qk();
zh.Read(i);
ansb=ansb*zh;
}
bool jud=0;
if(ansa.len>ansb.len){
printf("No\n");
jud=1;
}
else if(ansa.len<ansb.len){
printf("Yes\n");
jud=1;
}
else {
for(int i=ansa.len;i>=1;i--){
if(ansa.a[i]>ansb.a[i]){
printf("No\n");
jud=1;
break;
}
else if(ansa.a[i]<ansb.a[i]){
printf("Yes\n");
jud=1;
break;
}
}
if(jud==0)printf("Yes\n");
}
}
return 0;
}