【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;
}
复制代码
posted @   ViKyanite  阅读(130)  评论(0编辑  收藏  举报
编辑推荐:
· 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训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示
主题色彩