题目链接:https://vjudge.net/problem/HDU-2685
这道题要知道这个公式:
gcd(am-1,an-1) = agcd(m,n)-1
推广:
若 gcd(a,b)=1
gcd(am-bm,an-bn) = agcd(m,n)-bgcd(m,n)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int k;
ll pow(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1) res=res*a%k;
a=a*a%k;
b>>=1;
}
return res%k;
}
ll gcd(ll a,ll b)
{
if(b==0)
{
return a;
}
return gcd(b,a%b);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll a,m,n;
scanf("%lld%lld%lld%lld",&a,&m,&n,&k);
ll ans1=pow(a,gcd(m,n)); ///(a - b) % p = (a % p - b % p ) % p
printf("%lld\n",(ans1-1+k)%k);
}
}
本文介绍了一个关于最大公约数(GCD)和幂运算的数学算法,通过一个具体的编程题目,展示了如何利用GCD的性质进行高效计算。算法涉及到公式gcd(am-1,an-1)=agcd(m,n)-1及其推广形式,提供了C++实现代码,适用于解决特定类型的数学问题。
3401

被折叠的 条评论
为什么被折叠?



