A positive proper divisor is a positive divisor of a number nn,
excluding nn itself.
For example, 1, 2, and 3 are positive proper divisors of 6, but 6 itself is not.
Peter has two positive integers nn and dd. He would like to know the number of integers below nn whose maximum positive proper divisor is dd.
InputThere are multiple test cases. The first line of input contains an integer TT (1≤T≤106)(1≤T≤106),
indicating the number of test cases. For each test case: Peter has two positive integers nn and dd. He would like to know the number of integers below nn whose maximum positive proper divisor is dd.
The first line contains two integers nn and dd (2≤n,d≤109)(2≤n,d≤109). OutputFor each test case, output an integer denoting the answer.
Sample Input
9 10 2 10 3 10 4 10 5 10 6 10 7 10 8 10 9 100 13Sample Output
1 2 1 0 0 0 0 0
4
剛開始不知道結論,就直接暴力求解,當然超時了LOL
- 設p爲d的最小質因子,a爲2到p的所有質數,以d爲最大非平凡(真)因子的數爲a*d。
所以:證明:
設a∗d=n,d的最小的質因子爲p,d=p∗p′,p′最小爲一假設a>p
n=a∗p∗p′=p∗(a∗p′)
∵a>p
∴a∗p′>p∗p′=d
∴a>p時,d不是n的最大因子
∴d時n的最大因子時,a<=p
∵d爲n的最大因子時,a一定爲n的最小因子,而一個數的最小因子一定爲質數
至此結論得證
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<string.h>
#define LL long long
using namespace std;
bool isprime[100010];
int prime[100010],cnt;
void init(){
memset(isprime,1,sizeof isprime);
isprime[0]=isprime[1]=false;
cnt=0;
for(int i=2;i<=100000;++i){
if(isprime[i]){
prime[cnt++]=i;
for(LL j=(LL)i*i;j<=100000;j+=i)
isprime[j]=false;
}
}
}
int main(){
int t;
init();
scanf("%d",&t);
while(t--){
int n,d;
int ans=0;
scanf("%d%d",&n,&d);
n=(n-1)/d;
for(int i=0;i<cnt&&prime[i]<=n;++i){
++ans;
if(d%prime[i]==0)
break;
}
printf("%d\n",ans);
}
return 0;
}