T1 yuuustu:
可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$
然后我就用神奇0.4骗分水过
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e6+10; 4 struct BigInt{ 5 int a[100005]; 6 BigInt(){memset(a,0,sizeof(a));a[0]=a[1]=1;} 7 BigInt friend operator * (BigInt x,int y){ 8 int len=x.a[0],las=0; 9 for(register int i=1;i<=len;++i){ 10 x.a[i]=x.a[i]*y+las; 11 las=x.a[i]/10; 12 x.a[i]%=10; 13 if(i==len&&las) ++len; 14 } 15 return x.a[0]=len,x; 16 } 17 void print(){ 18 for(int i=a[0];i>=1;--i) cout<<a[i]; 19 } 20 }; 21 inline bool chk(BigInt a,BigInt b){ 22 for(int i=0;i<=a.a[0];++i) if(a.a[i]!=b.a[i]) return 0; 23 return 1; 24 } 25 inline bool cmp(BigInt a,BigInt b){//x^y y! 26 if(a.a[0]==b.a[0]) if(chk(a,b)) return 1; 27 if(a.a[0]^b.a[0]) return a.a[0]<b.a[0]; 28 else{ 29 for(register int i=a.a[0];i>=1;--i){ 30 if(a.a[i]==b.a[i]) continue; 31 if(a.a[i]>b.a[i]) return 0; 32 else if(a.a[i]<b.a[i]) return 1; 33 } 34 } 35 } 36 void work_1(int x,int y){ 37 if(x>y*0.4) puts("No"); 38 else puts("Yes"); 39 } 40 int main(){ 41 freopen("yuuutsu.in","r",stdin); 42 freopen("yuuutsu.out","w",stdout); 43 int T; 44 scanf("%d",&T);register int x,y; 45 while(T--){ 46 scanf("%d%d",&x,&y); 47 if(x>1000||y>1000){work_1(x,y);continue;} 48 BigInt Fir,Sec; 49 Fir.a[0]=Fir.a[1]=1; 50 Sec.a[0]=Sec.a[1]=1; 51 for(register int i=1;i<=y;++i) Fir=Fir*x; 52 for(register int i=1;i<=y;++i) Sec=Sec*i; 53 //Fir.print();puts("");Sec.print(); 54 if(cmp(Fir,Sec)) puts("Yes"); 55 else puts("No"); 56 } 57 fclose(stdin); 58 fclose(stdout); 59 return 0; 60 }