【疑】poj 2773 Happy 2006 互素问题(★★☆☆☆)

http://poj.org/problem?id=2773

题意:给定一个正整数,求与其互素的第K个整数。

在这里要说一下什么叫互素:如果两个正整数X和Y的最大公约数为1,那么就说X与Y互素。

这个用普通算法很容易超时,而有有些算法又篇幅较大。最后终于搜到一篇特别巧妙的算法,感觉自己一定要加强数学方面的学习。这个算法的核心代码有点不容易理解,想了半天也没弄的十分明白。有高手路过,请指点迷津!!!

 

Sample Input

2006 1
2006 2
2006 3

Sample Output

1
3
5

 

  • Source Code
    #include <iostream> //求出<=m的互质的 大于m的都是在上面加m的倍数  
    using namespace std;
    int prime[1000000];
    int gcd(int n,int m)
    {
    	if(n<m)
    		swap(n,m);
    	int r;
    	while(m!=0)
    	{
    		r=n%m;
    		n=m;
    		m=r;
    	}
    	return n;
    }
    int main()
    {
    	int m,k,i,j;
    	while(cin>>m>>k)
    	{
    		j=0;
    		for(i=1;i<=m;++i) //不能写成i<m,因为要考虑m==1的情况
    			if(gcd(m,i)==1)
    				prime[++j]=i;
    		if(k%j==0) //要另外处理 k%j==0
    			cout<<m*(k/j-1)+prime[j]<<endl;
    		else
    			cout<<m*(k/j)+prime[k%j]<<endl;
    	}
    	return 0;
    
    }
  • 引自:http://blog.sina.com.cn/s/blog_70d4bfdf0100o76d.html

    posted @ 2011-04-28 14:42  Pengchao Bai  阅读(346)  评论(0编辑  收藏  举报