【ZOJ-4123】Happy Equation
思路:
一看到这个题目我就开始打表了。通过打表可以发现,当a为奇数的时候答案为1。当a为偶数的时候,x一定也是偶数。
所以我们可以假设以下的两种情况:
a 为 奇数时,假如a^b 为奇数
此时的b有两种情况
1、b 为偶数时: b^a 明显是一个偶数(不符合)
2、b 为奇数时:不存在,除了本身。
a为偶数时:,假如a^b为偶数
此时b有两种情况
1、b 为奇数时:(不符合)
2、b 为偶数时:用t来表示a:a = 2 * t,那么a^x = (2t)^x = 2^x * t^x
当x >= p时,mod后为0
当x < p时,暴力求解。
从等式的右边开始看:b = 2^x * t, 那么b^a = 2^{ax} * t^a
当ax >= p时,假设mod后为0时:得到x >= ceil(p/a)
在第一种和第二种情况分析下,取最大范围的 [ ceil( p / a ) , 2^p ]
然后记得,如果这个范围中包含了,我们第一种情况中的暴力求解,要剔除
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll qpow(ll a, ll b,ll mod,ll ans=1){ ll Ans = ans; a %= mod; while (b){ if (b & 1){ Ans = Ans * a % mod; } a = a * a % mod; b >>= 1; } return Ans; } int main() { int T; cin >> T; while(T--) { ll a, p; scanf("%lld%lld",&a,&p); if (a & 1) { cout << 1 <<endl; continue; } ll P = (1ll << p); ll Ans = 0 ; for (int i = 0; i <= p; i++) if (qpow(a, i, P) == qpow(i, a, P)) ++Ans; ll x = ((p-1) / a)+1; Ans = Ans + ((1ll << (p-x))) - (p >> x); cout << Ans << endl; } return 0; }

浙公网安备 33010602011771号