当前位置: 代码迷 >> 综合 >> 【HDU2685】I won't tell you this is about number theory
  详细解决方案

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

热度:12   发布时间:2024-01-13 10:05:48.0

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2685
题解
这道题的题目背景是我见过最美妙最简洁最通俗易懂的题目背景
要知道一个公式
gcdAm?Bm,An?Bn=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;
} 
  相关解决方案