• 微软原版系统

  • 一键重装系统

  • 纯净系统

  • 在线技术客服

魔法猪系统重装大师 一键在线制作启动 U 盘 PE 系统 用一键重装的魔法拯救失去灵魂的系统
当前位置:首页 > 教程 > 电脑教程

约数魔方(ct14)问题解答

时间:2015年04月02日 15:42:37    来源:魔法猪系统重装大师官网    人气:7113

题目描述:
我们知道,一个数K若能被除开1和它本身外的数整D除,这个数就叫做合数
D就叫做K的一个约数。现在进行一个游戏,每一数都能加上它的除1和本身
外的一个约数D从而变成另外一个数。现在给你两个数N,M,问从N到M最少
要进行多少次加法的操作.如果按照上面的操作从N不能到达M,则输出-1

输入:
多组测试数据,每组一行两个数 N, M (4<=N<=M<=100000)
以EOF结束输入

输出:
上面那个问题的结果

样例输入:
4 24
4 576

样例输出:
5
14

其它信息:
Contest 14 比赛题
题目提供:ailyanlu

难度:Normal

#include
#include
#include
#include
using namespace std;

const int maxn = 100001 ;
int mark[maxn] ;
int myq[maxn] ;
bool isprimer[maxn];

void getprimer()
{
int i , j ;
memset(isprimer,true,sizeof(isprimer));
for(i = 2 ; i < maxn/i ; ++i)if(isprimer)
{
for(j = i*i ; j < maxn ; j+= i )isprimer[j] = false ;
}
}
int solve(int N ,int M )
{
int i ;
memset(mark, -1 ,sizeof(mark));
int first = 0 , tail = 0 ;
myq[first] = N ;
mark[N] = 0 ;

if(mark[M] != -1 )return mark[M];
if(isprimer[N] || isprimer[M])return -1 ;
while(first <= tail)
{
int k = myq[first] ;
for( i = 2 ; i <= k/i ; ++i)if(k%i==0)
{
if(k+i < maxn){
if(mark[k+i] == -1 || mark[k+i] > mark[k]+1){
++tail;
myq[tail] = k+i;
mark[k+i] = mark[k] + 1 ;
}
}
if(k + k/i < maxn){
if(mark[k+k/i] == -1 || mark[k+k/i] > mark[k] +1){
++tail;
myq[tail] = k+k/i;
mark[k+k/i] = mark[k] + 1 ;
}
}
if(mark[M] != -1)return mark[M];
}
++first ;
}
return mark[M];
}

int main()
{
//freopen("datain4.txt","r",stdin);
//freopen("dataout4_v4.txt","w",stdout);
int N , M ;
getprimer();
while(scanf("%d%d",&N,&M)!=EOF)
{
printf("%d\n",solve(N,M));
}
//printf("time = %d\n",clock());
return 0;
}

约数,魔方,ct14,问题解答,题目,描述,我们,知道,
栏目:电脑教程 阅读:1000 2023/12/27
Win7教程 更多>>
U盘教程 更多>>
Win10教程 更多>>
魔法猪学院 更多>>

Copyright © 2015-2023 魔法猪 魔法猪系统重装大师

本站发布的系统仅为个人学习测试使用,请在下载后24小时内删除,不得用于任何商业用途,否则后果自负,请支持购买微软正版软件。

在线客服 查看微信 返回顶部