hunnu11550[数学+搜索]欧拉函数

来源:互联网 发布:lcdp0端口定义 编辑:程序博客网 时间:2024/04/29 17:40

欧拉函数Time Limit: 3000ms, Special Time Limit:6000ms, Memory Limit:65536KBTotal submit users: 73, Accepted users: 59Problem 11550 : No special judgementProblem description  一个数x的欧拉函数Φ(x)定义为所有小于x的正整数中与x互质的数的数目,如小于5且和5互质的数有1、2、3、4,一共4个,故Φ(5)=4。

对于任意正整数x,我们定义两种操作: 
1、f(x) = x + Φ(x);
2、g(x) = x * Φ(x);

现在,给定一个数a,问从1开始,需要多少步操作能得到a。
(如,当a = 2时,f(1)即为所求,故答案为1,而当a = 3时,f(f(1))即为所求,故答案为2) 

Input  每行输入一个整数a(0<a<=100000)。 
Output  输出需要的步数,如果无法得到,输出-1;
Sample Input
23
Sample Output
12
Problem Source  HUNNU Contest 

打出欧拉函数表格,根据提供的公式做BFS搜索。。。

#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>#define LL long longusing namespace std;const int N = 100050;const int INF = 0x3f3f3f3f;int oula[N+5];int ans[N+5];void bfs(){    int i,j,k;    queue<int> Q;    for(i = 1;i<=N;i++)    {        oula[i]=i;        ans[i] = INF;    }    for(i = 2;i<=N;i++)    {        if(i==oula[i])        {            for(j = 1;j*i<=N;j++)            {                oula[j*i] = (oula[j*i]/i)*(i-1);            }        }    }    ans[1] = 0;    Q.push(1);    while(!Q.empty())    {        int s = Q.front();        Q.pop();        if(s+oula[s]<=N&&ans[s+oula[s]]>ans[s]+1)        {            ans[s+oula[s]]=ans[s]+1;            Q.push(s+oula[s]);        }        if((LL)s*oula[s]>N) continue;        if((LL)s*oula[s]<=N&&ans[s*oula[s]]>ans[s]+1)        {            ans[s*oula[s]]=ans[s]+1;            Q.push(s*oula[s]);        }    }}int main(){    LL i,j,k;    int n;    bfs();    while(~scanf("%d",&n))    {        if(ans[n]==INF) puts("-1");        else        printf("%d\n",ans[n]);    }    return 0;}


0 0
原创粉丝点击