分析:此题的结构是按从前往后用位置挑选合适的数字。每一次,枚举前一位置数字素因子,用素因子寻找用同样拥有该素因子且未进队的最小整数(公因子可以分解成素因子),
伪代码:
ans=INF;
枚举前一位置素因子
{
寻找用同样拥有该素因子且未进队的最小整数;
更新ans=min(最小整数,ans)
}
现在位置=ans; 代码:
部分参考于:POJ 1619 EKG Sequence
枚举前一位置素因子
{
寻找用同样拥有该素因子且未进队的最小整数;
更新ans=min(最小整数,ans)
}
现在位置=ans; 代码:
<span style="font-family:SimSun;font-style: normal;">#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
const int MAXN=1000005;
int rec[MAXN],nex[MAXN],b[MAXN];
void make_table()
{
int i,j;
rec[1]=1;
rec[2]=2;
for(i=1;i<MAXN;i++)//拥有因子为i且未进队的最小整数(实际上后面代码只用了其中下标为素因子的部分)
nex[i]=i;
nex[2]=4;
for(i=2;i<MAXN;i++)//b[]存储每个数字的最小素因子,
if(b[i]==0)
{
for(j=1;i*j<MAXN;j++)
if(b[i*j]==0)b[i*j]=i;
}
int cur=2;
for(i=2;i<MAXN;i++)
{
int k=cur;
cur=MAXN;
for(int p=b[k];p!=1;)
{
while(rec[nex[p]]&&nex[p]+p<MAXN)//更新
nex[p]+=p;
cur=min(cur,nex[p]);
while(k%p==0)k=k/p;//查找下一个素因子
}
rec[cur]=i+1;//找到该位置的数字,并在以数字为索引的数组里存进位置标号
}
}
int main()
{
int n;
make_table();
while(~scanf("%d",&n)&n)
{
printf("The number %d appears in location %d.\n",n,rec[n]);
}
return 0;
}</span>
部分参考于:POJ 1619 EKG Sequence