码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-05-18 23:35:13      阅读:368      评论:0      收藏:0      [点我收藏+]

标签:number   std   names   amp   get   bit   about   http   ...   

题目链接:

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和快速幂的性质

标签:number   std   names   amp   get   bit   about   http   ...   

原文地址:https://www.cnblogs.com/fzl194/p/9058366.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!