2021mrctf------nomore
因为 $\frac{y+1}{x}$ 是整数。
(1) 若 $y=x-1$
$A=1+(x-1)^{5}+1$
经计算 $x$ 无解
(2)若 $y=k*x-1$
$A=(x-1)^{7}+(k*x-1)^{5}+k$
由式子可知, $x,k$ 和 $A$ 正向先关,且提示 $k$ 很小,所以可以考虑二分。效率 $O(klog_{2}^{x})$
A = 2235930885430590738951770802593215586722001521194365487273377655750584443688709547709496531484159367793509666612116139038917661713102981488722293426038029073850795986080412124312908732573382156365974821471629333126275130148211145598662897276781331183691743094904957217401055325352877284530068805608962270139656431076370452327497416723045785664344412694060886085511378779487559306015113302658964110922621164879307182468690182325142055960562810349297544601157473985262796723316777380726315782859115449976700612343978057140270903396910431420116573138154719798955123904805279320166126412714788508008881174164656203605409187705643395043643983135944514470267283183175620492198093264226038082725867230101096344723124629565311122528005863046865164876192248803940590219355154176343702897505891392317123983475290611327887699795851456183931854177169939743970260837586185988111368384484356413787993370384262996486824251003884057486063787194241555190688935624792041028246639984544749568167915235629185515957106136630401960066317998226671344793061752525215496195839080165952892472180997564802474095868944184005854120238623750555477937802107959321257495435617363809377093354132077991399603767147974592666019334636208414969819333321639542282741932229892501074615920120228860717401055433206357806353717291748096464569063777964784860874773660469621546777686833078007220613545223169043960754010332944526795605043595879174073360317477199909570141202125189377475655277483919081658123820105695508771837612756891055031293872293977244105248233915807603916034288916844336329883443200123825714530812637709561686224468031953278836676202928878535091578725509651544544672494980806630321114490828976895602038151224026672265830787863940762596976124958000977955469148027648603199590311852993367450800166591526272653355552342455506908317529193196174849749103073968182002498580115241030154502931088245539152380579199202750010140022979979488971008874424439325749039212427088023136971891092490697689178097172878439007028844083681030357488034860471042630885195387680286557424780235116405464735985082715745087677866688657626763753940919966662710093619034074861812080778855241391731006 maxn = 4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 def f(x,k): return pow(x-1,7)+pow(k*x-1,5)+k-A def binary_search(l,r,k): while l<=r : mid = (l+r)//2 res = f(mid,k) if res == 0 : return(mid,1) if res < 0: l=mid+1 else: r=mid-1 return (mid,f(mid,k) == 0) k=2 while 1: (x,pd) = binary_search(1,maxn,k) if pd: print(x,k) break k=k+1
解得
x=3009497962071627970325880719364587885671010480057866287334251735956364570350347087026477982283392009667042015682364869764534877202626872343001563490279098970253786309533656152965171286503259912849977668331206169132653702870703716072003169079329188859516303445545911170476352380900189590650131003576924340724
k=84
secret=7754486886526049025
根据条件
$e^{3}+p^{3}+q^{3}==secret$
暴力枚举出 $e,p$ 判断 $q$ 是否符合条件
效率大概是 $O(e*1e5*logA) $ ( $1000000-3000000$ 的质数大概有 $1e5$ 个)
#include<bits/stdc++.h> #define ull unsigned long long using namespace std; const int N=3e6+5; bool ispri[N]; int top,pri[N]; ull secret=7754486886526049025; void getpri(){ ispri[0]=1; for(int i=2;i<=3000000;i++){ if(!ispri[i])pri[++top]=i; for(int j=1;j<=top&&i*pri[j]<=3000000;j++){ ispri[i*pri[j]]=1; if(i%pri[j]==0)break; } } int now=0; for(int i=1;i<=top;i++){ if(pri[i]>1000000)pri[++now]=pri[i]; } top=now; } ull pow(int x){ return (ull)x*(ull)x*(ull)x; } int calc(ull tmp){ int l=1000000,r=3000000; if(tmp<pow(l)||tmp>pow(r))return 0; int mid; while(l<=r){ mid=(l+r)>>1;ull res=pow(mid); if(res==tmp)return mid; if(res<tmp)l=mid+1; else r=mid-1; } return 0; } ull gcd(ull x,ull y){ if(x==0)return y; return gcd(y%x,x); } int main(){ getpri(); for(int e=9000;e<=10000;e++){ for(int i=1;i<=top;i++){ ull tmp=(ull)secret-pow(pri[i])-pow(e); int q=calc(tmp); if(ispri[q])continue; int p=pri[i]; ull phi=(ull)(p-1)*(q-1); if(gcd((ull)e,phi)!=1)continue; printf("e = %d\np = %d\nq = %d\n",e,p,q); return 0; } } return 0; }
解得
e = 9509
p = 1076303
q = 1866989