【HDU2685】I won't tell you this is about number theory

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2685
题解
这道题的题目背景是我见过最美妙最简洁最通俗易懂的题目背景
要知道一个公式
gcdAmBm,AnBn=Agcd(m,n)Bgcd(m,n)
这里B=1
证明过程
由乘法公式(x-y)(x^(k-1)+x^(k-2)y+…+y^(k-1)) = x^k-y^k,
可知a^(m,n)-b^(m,n) | a^m-b^m, a^(m,n)-b^(m,n) | a^n-b^n,
进而有a^(m,n)-b^(m,n) | (a^m-b^m,a^n-b^n).
只需再证明(a^m-b^m,a^n-b^n) | a^(m,n)-b^(m,n).
设c = (a^m-b^m,a^n-b^n), 则(c,b) = 1.
若不然, 设质数p | (c,b), 由p | b, p | c | a^m-b^m得p | a^m.
可得p | a, p | (a,b), 与(a,b) = 1矛盾, 故(c,b) = 1.
设d = (m,n), 由Bezout定理, 存在正整数u, v, 使um-vn = (m,n) = d.
由c | a^n-b^n, 有c | a^(vn)-b^(vn), 进而c | a^d·(a^(vn)-b^(vn)) = a^(um)-a^d·b^(vn).
而由c | a^m-b^m, 有c | a^(um)-b^(um).
相减得c | a^d·b^(vn)-b^(um) = (a^d-b^d)·b^(vn).
但(c,b) = 1, 于是c | a^d-b^d, 即(a^m-b^m,a^n-b^n) | a^(m,n)-b^(m,n).

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
LL a,n,m,k;

LL gcd(LL x,LL y)
{
    return (!y)?x:gcd(y,x%y);
}

LL ksm(LL a,LL b,LL mod)
{
    LL ans=1;
    while(b)
    {
        if(b&1) ans=(ans*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return ans % mod;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        scanf("%lld%lld%lld%lld",&a,&n,&m,&k);
        LL GCD=gcd(m,n);
        printf("%lld\n",(ksm(a,GCD,k)-1+k)%k);
    }
    return 0;
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值