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

来源:互联网 发布:java前端开发 编辑:程序博客网 时间:2024/06/08 18:13

题目链接: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 longusing 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;} 
原创粉丝点击