gggyt  
没谁离不开谁

  题意:给你一个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;
}

 

posted on 2017-08-19 09:41  gggyt  阅读(176)  评论(0编辑  收藏  举报