题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5750
—————————————–.
Dertouzos Accepts: 76 Submissions: 1357
Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
问题描述
正整数
x
称为
Peter给你两个正整数
n
和
输入描述
输入包含多组数据, 第一行包含一个整数
T(1≤T≤106)
表示测试数据组数. 对于每组数据:
第一行包含两个整数
n
和
输出描述
对于每组数据, 输出一个整数.
输入样例
9
10 2
10 3
10 4
10 5
10 6
10 7
10 8
10 9
100 13
输出样例
1
2
1
0
0
0
0
0
4
—————————————————-.
题目大意: 自己看
解题思路:
首先要明确的是 N*M的最大因子为N的时候只有M为素数 且M<=N的最小素因子的时候 ;
试想
N=pa11∗pa22∗pa33∗pa44∗……∗pann;(p[i]<p[i+1])
如果M不是素数那么M=X*Y,N*M的因子中 就多了N*X和N*Y 均比N大 所以不成立
如果M>p1 (假设所有的ai均为1)那么N*M的因子中 就多了
M∗p2∗p3∗p4∗……∗pn
一定大于
p1∗p2∗p3∗p4∗……∗pn
所以也不成立 至于某个
ai>1
的时候同理
也不行
所以先打出sqrt(1e9)内的所有素数
然后暴力找即可
for(int i=0;i<k;i++)
{
if(d*prime[i]>=n) break;
sum++;
if(d%prime[i]==0) break;
}
k值不到1e4 加上题目3500ms 就能过了
附上本题代码
———————————————————-.
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
#define LL __int64
const LL MOD = 1e9+7;
const LL INF = 0x3f3f3f3f;
int Is_or[101010];
int prime[10000];
int k=0;
void Prime()
{
memset(Is_or,1,sizeof(Is_or));
int n=100000;
for(int i=2;i<=n;i++)
if(Is_or[i])
{
prime[k++]=i;
for(int j=i+i;j<=n;j+=i)
Is_or[j]=0;
}
return ;
}
int primeproper(int num,int n)
{
int sum=0;
for(int i=0;i<k;i++)
{
if(num*prime[i]>=n) break;
sum++;
if(num%prime[i]==0) break;
}
return sum;
}
int main()
{
Prime();
printf("%d %d ",prime[k-1],prime[4229]);
printf("%d\n",k);
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
int d = primeproper(m,n);
printf("%d\n",d);
}
return 0;
}