hdu-2685 I won't tell you this is about number theory---gcd和快速冪的性質
阿新 • • 發佈:2018-05-19
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和快速冪的性質