题意
给你
,然后让你求解
,有
,使得
成立的解的数目。
思路:
思路不是很好想,看别人题解后才做出来。
毫无疑问的是
肯定是n的因子,假设
,那么肯定有
,即
互质,因为
,所以必有
,且互质,根据欧拉函数的定义,我们要求解的数目,即是求
的和,其中a为 大于等于m的因子。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 2e6 + 10;
ll fac[N];
int tot ;
ll phi(ll n){
ll ans = n;
for(ll i = 2;i <= sqrt(n);++i){
if(n % i == 0){
ans = ans / i * (i - 1);
while(n % i == 0) n /= i;
}
}
if(n > 1) ans = ans /n *(n - 1);
return ans;
}
int main(){
ll n,m;
int t;
cin>>t;
while(t--){
tot = 0;
cin >> n >> m;
for(ll i = 1;i <= sqrt(n);++i){//找n的因数
if(n % i == 0){
fac[++tot] = i;
if(n/ i != i) fac[++tot] = n / i;
}
}
sort(fac + 1,fac + tot + 1);
int idx = lower_bound(fac + 1,fac + tot + 1,m) - fac;//找到大于等于m的位置
ll sum = 0;
for(int i = idx; i <= tot;++i){
sum += phi(n / fac[i]);
}
cout<<sum<<endl;
}
}