Problem Description
A positive proper divisor is a positive divisor of a number
n
, excluding
n
itself. For example, 1, 2, and 3 are positive proper divisors of 6, but 6 itself is not.
Peter has two positive integers n and d . He would like to know the number of integers below n whose maximum positive proper divisor is d .
Peter has two positive integers n and d . He would like to know the number of integers below n whose maximum positive proper divisor is d .
Input
There are multiple test cases. The first line of input contains an integer
T
(1≤T≤106)
, indicating the number of test cases. For each test case:
The first line contains two integers n and d (2≤n,d≤109) .
The first line contains two integers n and d (2≤n,d≤109) .
Output
For 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 13
Sample Output
1 2 1 0 0 0 0 0 4
题意: 给你到n的数列,求这里边的数最大非平凡因子(非平凡:不等于1和它本身)为d的个数。
思路:a*d=n(d为n的最大非平凡因子,d<n&&a>1)d=p*p'(p为d的最大非平凡因子,p<d&&p'>1)==> n=a*p*p' 范围:1<a<=p'<=p;根据该范围枚举每一个因子。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
int is[100000 +5];
int ds()
{
is[0] = 2;
is[1] = 3;
int k = 2;
for(int i = 5; i <= 100000; i++)
{
int temp = sqrt(i);
bool judge = 0;
for(int j = 2; j <= temp; j++)
if(i%j == 0)
{
judge = 1;
break;
}
if(judge == 0)
is[k++] = i;
}
return k;
}
int main()
{
int k = ds();
int t;
scanf("%d",&t);
while(t--)
{
int n,d,sum = 0;
scanf("%d%d",&n,&d);
//int temp = sqrt(d);
for(int i = 0; is[i] <= d; i++)
{
if(is[i]*d < n)
sum++;
else
break;
if(d%is[i] == 0) //a<p'
break;
}
printf("%d\n",sum);
}
}