/*********************************
* 日期:2013-1-30
* 作者:SJF0115
* 题目:XDOJ Problem 1003 - 最喜欢的数字
* 来源:http://acm.xidian.edu.cn/land/problem/detail?problem_id=1003
* 结果:Time Limit Exceeded
* 总结:简单的动态规划,先筛选出1-100000内的素数。
设f[i]=把i变成1的最少操作,则: f[1]=0; f[素数]=1;
f[i*素数]=min(f[i]+1,f[i*素数-1]+1);(因为有两种手段:m=m/p;m=m-1)
**********************************/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int prime[100001];
int f[100001];
//筛选素数
int Prime(){
int i,j;
for(i = 1;i < 100001;i++){
if(i%2 == 0)//偶数
{
prime[i] = 0;
}
else//奇数
{
prime[i] = 1;
}
}
for(i = 3; i <= sqrt(100001); i+=2)
{
if(prime[i])//奇数
{
for(j = i+i;j < 100001;j+=i)//奇数的倍数
{
prime[j] = 0;
}
}
}
prime[2] = 1;
return 0;
}
//选择较小者
int Min(int x,int y){
if(x < y){
return x;
}
else{
return y;
}
}
int main()
{
int a,b;
Prime();
//freopen("C:\\Users\\SJF\\Desktop\\acm.txt","r",stdin);
while(scanf("%d %d",&a,&b)!=EOF)
{
int i,j;
int count = 0;
f[1] = 0;
//f[素数]=1
for(i = 2;i < 100001;i++){
if(prime[i] == 1){
f[i] = 1;
}
}
//f[i*素数]=min(f[i]+1,f[i*素数-1]+1)
for(i = 2;i < 100001/2;i++){
for(j = 2;j < 100001 && i*j < 100001;j++){
if(prime[j] == 1){
f[i*j] = Min(f[i]+1,f[i*j-1]+1);
}
}
}
for(i = a;i <= b;i++){
count += f[i];
}
printf("%d\n",count);
}
return 0;
}
XDOJ Problem 1003 - 最喜欢的数字 Time Limit Exceeded
最新推荐文章于 2023-05-14 23:48:57 发布