Codeforces1295D. Same GCDs (欧拉函数)

https://codeforces.com/contest/1295/problem/D

设gcd(a,m)= n,那么找gcd(a +x ,m)= n个数,其实就等于找gcd((a+x)/n,m/n) = 1的个数,等价于求m/n的欧拉函数

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

 

posted @ 2020-02-02 19:42  AaronChang  阅读(193)  评论(0编辑  收藏  举报