#include <iostream>
#include <cmath>
using namespace std;
const int N=1000005;
int prime[N];
void IsPrime(){ //埃式筛法打质数表
prime[0]=0;prime[1]=0;prime[2]=1;
for(int i=3;i<N;i++)
prime[i]=(i%2==0?0:1);
for(int i=3;i<=sqrt(N);i++) {
if(prime[i]) {
for(int j=i*i;j<=N;j+=2*i)
prime[j]=0;
}
}
}
int main(){
int t;
scanf("%d",&t);
IsPrime();
while(t--){
int count=0;
int n,d;
scanf("%d%d",&n,&d);
for(int i=2;i<=d;i++){
if(prime[i]){
if(d*i<n) count++;
if(d%i==0) break; //很重要很重要的一步
if(d*i>=n) break;
}
}
printf("%d\n",count);
}
}
#include <iostream>
#include <cmath>
using namespace std;
const int N=1000005;
int prime[N];
void IsPrime(){ //埃式筛法打质数表
prime[0]=0;prime[1]=0;prime[2]=1;
for(int i=3;i<N;i++)
prime[i]=(i%2==0?0:1);
for(int i=3;i<=sqrt(N);i++) {
if(prime[i]) {
for(int j=i*i;j<=N;j+=2*i)
prime[j]=0;
}
}
}
int main(){
int t;
scanf("%d",&t);
IsPrime();
while(t--){
int count=0;
int n,d;
scanf("%d%d",&n,&d);
for(int i=2;i<=d;i++){
if(prime[i]){
if(d*i<n) count++;
if(d%i==0) break; //很重要很重要的一步
if(d*i>=n) break;
}
}
printf("%d\n",count);
}
}
1.这题大概的思路是打出素数表,然后枚举i 。如果i是素数且i*d<n(n以内的整数)、d%i!=0(d是最大的正约数),则满足题意;
2.我开始一直忽略了d i之间整除的关系,所以就一直WA 。提供一组测试数据:41 8 答案应该为1;
3.官方题解:
我没看懂。。。