Integer S(数论gcd的运用)

本文探讨了一种结合快速幂运算和最大公约数(GCD)的算法,用于解决特定的数学问题。具体地,给出了如何计算S=gcd(a^m-1,a^n-1)%k的解决方案,通过引入一个关键等式变化,将问题简化为求解a^gcd(m,n)-1。文中提供了一个C++实现示例,包括快速幂和GCD的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

To think of a beautiful problem description is so hard for me that let’s just drop them off. 😃

Given four integers a,m,n,k,and S = gcd(am-1,an-1)%k,calculate the S.

InputThe first line contain a t,then t cases followed.

Each case contain four integers a,m,n,k(1<=a,m,n,k<=10000).OutputOne line with a integer S.

Sample Input
1
1 1 1 1
Sample Output
0
题意:有a,m,n,k,求有给出等式得到的s;
解题思想: S = gcd(a ^ m-1 , a ^ n-1)%k 这个等式的运用,可以看出是快速幂和gcd的使用,这得借助一个等式变化:gcd (a ^ m - b ^ m , a ^ n - b ^ n) = a ^ gcd(m,n)-b^gcd(m,n);有这个等式解决,可以看出b=1时就是此等式的标准形式,所有最终只需要求解 S = gcd ( a ^ m-1 , a ^n-1)%k=a ^gcd(m,n)-1,就可以了。

#include <iostream>

using namespace std;
typedef long long ll;
int mod;
int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}
long long pow(ll x,ll y)
{
    ll cnt=1;
    x=x%mod;
    while(y)
        {
            if(y&1) cnt=(cnt*x)%mod;
            y/=2;
            x=(x*x)%mod;
        }
    return cnt;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
        {
            ll a,m,n,k,ans;
            cin>>a>>m>>n>>k;
            mod=k;
            ll y=gcd(m,n);
            ans=(mod+pow(a,y)-1)%mod;
            cout<<ans<<endl;
        }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值