题目来源: http://acm.whu.edu.cn/learn/problem/detail?problem_id=1420
代码:
#include<stdio.h>
#include<vector>
using namespace std;
vector<int> frac;
int m, n;
long long int ans=0;
void bfs(int step, int fraci, int tol,int num){
if (step >= frac.size()){
if (tol & 1)
ans -= (long long) m / fraci;
else
{
ans += (long long )m / fraci;
}
return;
}
bfs(step + 1, fraci*frac[step], tol + 1,num);
bfs(step + 1, fraci, tol,num);
}
void prime(int num){
frac.clear();
int cur = num;
for (int i = 2; i*i <= num; i++){
if (cur%i == 0&&i!=num){
frac.push_back(i);
while (cur%i == 0)
cur /= i;
}
}
bfs(0, 1, 0,num);
}
int main(){
int k;
scanf_s("%d", &k);
for (int h = 0; h < k; h++){
ans = 0;
scanf_s("%d%d", &m, &n);
for (int i = 1; i <= n; i++){
prime(i);
if ((i <= m)&&(i!=1)) ans -= 1;
}
if(h!=k-1) printf("%d\n",ans);
else printf("%d", ans);
}
}
void prime(int num) 该函数求num的质因数
bfs() 求num与1...m互质对的个数。
把(1,1)看作互质对,把(2,2)不看作。