hdu 2588(简单的欧拉

Posted gggyt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 2588(简单的欧拉相关的知识,希望对你有一定的参考价值。

  题意:给你一个n,m问你1-n里面(x)有多少对gcd(x, n)>=m。

  思路:我们可以设n=a*b, x=a*c,此时我们可以知道b,c是互质的,那么就可以用欧拉来求解

/*  gyt
       Live up to every day            */
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<cstring>
#include<queue>
#include<set>
#include<string>
#include<map>
#include <time.h>
#define PI acos(-1)
using namespace std;
typedef long long ll;
typedef double db;
const int maxn = 1e6+10;
const ll maxm = 1e7;
const ll mod = 1e9 + 7;
const int INF = 0x3f3f3f;
const ll inf = 1e15 + 5;
const db eps = 1e-9;
const int kind=26;

ll euler(ll n){
     ll res=n,a=n;
     for(ll i=2;i*i<=a;i++){
         if(a%i==0){
             res=res/i*(i-1);
             while(a%i==0) a/=i;
         }
     }
     if(a>1) res=res/a*(a-1);
     return res;
}
void solve() {
    ll n, m;  scanf("%lld%lld", &n, &m);
    ll ans=0;
    for (ll i=1; i*i<=n; i++) {
        if (n%i==0) {
            if (i>=m)  ans+=euler(n/i);
            if (n/i>=m&&i*i!=n)  ans+=euler(i);
        }
    }
    cout<<ans<<endl;
}
int main() {
    int t = 1;
   // freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    scanf("%d", &t);
    while(t--)
        solve();
    return 0;
}

 

以上是关于hdu 2588(简单的欧拉的主要内容,如果未能解决你的问题,请参考以下文章

hdu2588 gcd 欧拉函数

[HDU2588]GCD 欧拉函数

hdu2588-GCD-(欧拉函数+分解因子)

GCD(欧拉函数)

HDU 2588 GCD

HDU 2588 GCD Euler + 暴力技巧