hdu-2685 I won't tell you this is about number theory---gcd和快速幂的性质

Posted 努力努力再努力x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu-2685 I won't tell you this is about number theory---gcd和快速幂的性质相关的知识,希望对你有一定的参考价值。

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2685

题目大意:

求gcd(am-1,an-1)%k

解题思路:

对于am-1 = (a - 1) * (1 + a + a2 + ... + am-1)

所以最开始的gcd就为a-1

对于两个1 + a + a2 + ... + am-1和1 + a + a2 + ... + an-1来说,可以找出gcd(m, n)那么久就可以提出gcd

比如:

1 + a + a2 + a3

1 + a + a2 + ... + a5

这两个可以写成(1+a)*(1 + a2) 和(1+a)*(1 + a2+ a4

就提出公因式(1 + a)

这里公因式如何确定呢?

就是从0一直加到m和n的gcd-1次方,这样的话m和n才可以分解成多个从0---gcd-1的幂之和

所以,gcd(am-1,an-1) = (a-1)*(1 + a + a2 + a3 + ... + ag-1) = ag - 1

上式中g等于gcd(m, n)

也就是这个式子:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int pow(int a, int b, int m)
 5 {
 6     int ans = 1;
 7     a %= m;
 8     while(b)
 9     {
10         if(b & 1)ans = ans * a % m;
11         a *= a;
12         a %= m;
13         b /= 2;
14     }
15     return ans;
16 }
17 int main()
18 {
19     int T, a, m, n, k, g;
20     cin >> T;
21     while(T--)
22     {
23         cin >> a >> m >> n >> k;
24         g = __gcd(m, n);
25         int ans = (pow(a, g, k) - 1) % k;
26         ans = (ans + k) % k;
27         cout<<ans<<endl;
28     }
29     return 0;
30 }

 

 

以上是关于hdu-2685 I won't tell you this is about number theory---gcd和快速幂的性质的主要内容,如果未能解决你的问题,请参考以下文章

nuget.exe push won't use API Key

Beijing's Best Events That Won't Leave You Hungover, Sep 12-17

15 Things in Shanghai Your Tour Guide Won't Show You

sum of rabbits who whelp and won't die

HDU 3729 I'm Telling the Truth (二分匹配)

HDU - 3729 I'm Telling the Truth(二分匹配)