您的位置:首页 > 其它

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

2017-07-21 15:05 447 查看
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2685

题解

这道题的题目背景是我见过最美妙最简洁最通俗易懂的题目背景

要知道一个公式

gcd(Am−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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐