【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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人