1. 程式人生 > >hdu-2685 I won't tell you this is about number theory---gcd和快速冪的性質

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

return ont 題目 def clas number class HR strong

題目鏈接:

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和快速冪的性質