Happy Equation ZOJ - 4123 (數論)


 題目鏈接:ZOJ - 4123 

 題目大意:給你a和p,然后問你[1,2^p]中滿足那個等式的值有多少個。

具體思路:

具體的證明:https://blog.csdn.net/v5zsq/article/details/79325038

打表發現當a為奇數的時候答案為1.當a為偶數的時候,x也必須為偶數。

然后我們將a分解為2*t。然后a^x就等於 (2^x)*(t^x).當x大於p的時候,此時取模后一定為0。對於所以在x屬於[0,p]這段區間暴力算。

然后我們將b分解為(2^k)*t.然后b^x就等於 (2^(k*x)) *(t^x).然后對於k*x>p的時候,我們可以直接算出這段區間中滿足情況的x的取值有多少x>(p/k)(向上取整).然后再減去暴力算的那一塊就好了。

AC代碼:

 1 #include<bits/stdc++.h>  2 using namespace std;  3 # define ll long long  4 # define inf 0x3f3f3f3f  5 const int maxn = 2e5+100;  6 ll qsm(ll t1,ll t2,ll mod)  7 {  8 ll ans=1ll;  9 while(t2) 10  { 11 if(t2&1) 12 ans=ans*t1%mod; 13 t1=t1*t1%mod; 14 t2>>=1; 15  } 16 return ans; 17 } 18 int main() 19 { 20 int T; 21 scanf("%d",&T); 22 while(T--) 23  { 24  ll a,p; 25 scanf("%lld %lld",&a,&p); 26 if(a%2!=0) 27  { 28 printf("%lld\n",1); 29 continue; 30  } 31 ll t1=(1ll<<p); 32 ll sum=0; 33 for(ll i=1; i<=p; i++) 34  { 35 if(qsm(a,i,t1)==qsm(i,a,t1)) 36 sum++; 37  } 38 ll tmp=(p/a)+(p%a==0?0:1); 39 sum=sum+(t1>>tmp)-(p>>tmp); 40 printf("%lld\n",sum); 41  } 42 return 0; 43 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM