题目链接: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 }
原文地址:https://www.cnblogs.com/letlifestop/p/10860998.html
时间: 2024-11-08 19:43:03