http://acm.hdu.edu.cn/showproblem.php?pid=2841
参考:http://www.cnblogs.com/kane0526/archive/2013/03/14/2795446.html
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#include <math.h>
#include <algorithm>
using namespace std;
#define N 100005
long long q[N];
vector<int>vt[N];
void init(){
for(int i=0;i<N;i++) vt[i].clear();
for(int i=2;i<N;i++){
int t=i;
for(int j=2;j*j<=i;j++) if(t%j==0){
vt[i].push_back(j);
while(t%j==0) t/=j;
}//for_j
if(t>1) vt[i].push_back(t);
}//for_i
}//init
long long cal(int n,int s){
int num=0;
q[num++]=1;
for(int i=0;i<vt[s].size();i++){
int ep=vt[s][i];
if(ep>n) break;
int k=num;
for(int j=0;j<k;j++) q[num++]=q[j]*ep*(-1);
}
long long sum=0;
for(int i=0;i<num;i++) sum+=n/q[i];
return sum;
}//cal
int main(){
int m,n,T;
init();
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
long long ans=n;
for(int i=2;i<=m;i++) ans+=cal(n,i);
printf("%lld\n",ans);
}//while
return 0;
}