一个超时的题,本是想用Java学调试的,写辛苦了,所以抄下来

原创 2012年03月23日 19:26:16
Two positive integers are said to be relatively prime to each other if the Great Common Divisor (GCD) is 1. For instance, 1, 3, 5, 7, 9...are all relatively prime to 2006. 

Now your job is easy: for the given integer m, find the K-th element which is relatively prime to m when these elements are sorted in ascending order. 


import java.util.*;
import java.math.*;

public class Main
{
	static int prime[] = new int[1000];
	static boolean isprime[] = new boolean[1000];
	static long factor[] = new long[20];
	
	public static void creatprime()//产生素数表
	{
	      Arrays.fill(isprime, false);
	      for(int i=2;i<1000; i+= 2)
	    	  isprime[i] = true;
	      int k=1;
	      prime[0]=2;
	      for(int i=3;i<1000;i+=2)
	      {
	    	  if(!isprime[i])
	    	  {
	    		  prime[k++] = i;
	    		  for(int j=i+i;j<1000;j+=i)
	    			  isprime[j]= true;
	    	  }
	      }
	}
	
	public static boolean isPrime(long n)//判断是不是素数
	{
		for(int i= 0;prime[i]*prime[i]<=n;i++)
		{
			if(n%prime[i]==0) return false;
		}
		return true;
	}
	
	public static void factors(long n)//对一个数求它的因子,并存入factor数组
	{
		int k = 0;
		Arrays.fill(factor,0);
		for(int i=0;prime[i]<=n&&i<1000;i++)
		{
			if(n%prime[i]==0)
			{
				factor[k++] = prime[i];
				while(n%prime[i]==0) n/=prime[i];
			}
		}
		return ;
			
	}
	
	public static int howMany(long n)//使用队列模拟容斥原理,其实不知道正不正确
	{
		Queue<Long> G = new ArrayDeque<Long>();
		for(int i=0;i<factor.length&&factor[i]!=0;i++)
			G.add(factor[i]);
		int sum = 0;
		while(!G.isEmpty())
		{
			long k = G.poll();
			sum += n/k;
			for(int i=0;i<factor.length&&factor[i]!=0;i++)
			{    
				if(factor[i]>k)
				if(Math.abs(k)%factor[i]!=0)
				{
					long temp = k*(-factor[i]);
					if(n/Math.abs(temp)!=0) G.add(temp);
				}
			}
		}
		return sum;
		
	}
	
	public static boolean hasFactor(long n)//数n有factor里的因子吗?
	{
		for(int i=0;i<factor.length && factor[i]!=0;i++)
			if(n%factor[i]==0)return true;
		return false;
	}
	

	public static void main(String[]args)
	{
		Scanner in = new Scanner(System.in);
		long k,m;
		
		Main.creatprime();
		
		while(in.hasNext())
		{
			k = in.nextLong();
			m = in.nextLong();
			
			if(m==1) System.out.println("1");//1的特殊判断
			else if(Main.isPrime(k))///k如果是素数,用下面的判别
			{
				if(m<k)System.out.println(m);
				else
				{
					long n = 1;
					while(n*(k-1)<m) n++;
					n = (n-2)*k + m - (n-2)*(k-1)+1;
					System.out.println(n);
				}
			}
			else//否则
			{
				Main.factors(k);//找k的因子
				long en = Main.howMany(m);//在m前已经有多少与k互斥的数
				en = m-en;
				
				for(long i=m+1;;i++)//从m+1开始逐一数与k互素的数
				{
					if(!Main.hasFactor(i)) en++;
					if(en==m){System.out.println(i);break;}
				}
			}
			
		}
	}
}


相关文章推荐

java常见的120道面试题第一季(每30题为一季,整理的好辛苦~~~)

哎,大晚上的看题,也是醉了,分享给大伙咯!!! 问答题1 /120 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 参考答案 Java虚拟机是一个可以执行Java字节码的虚拟机进...

我本是学机械的,却爱上了电子!

我本是学机械的,却爱上了电子!        2008年暑假,买了《深入浅出AVR单片机》这本书,再兴冲冲的跑到电子市场买了元器件,然后跟着书边焊接制作实验板边自学单片机。5V稳压电源模块、单片机最小...

写了一个HTML页面,想用手机打开怎么办?

写了个HTML页面,想用手机访问怎么办?有三种方式 一:xampp服务器(需要电脑一台,手机,xampp服务器)     具体实施步骤: 1.到官方下载xampp安装到电脑上 2.打开xampp,将写...

Java回调函数,自己辛苦的理解

关于回调函数,网上虽然有很多解答,但发现很难掌握。你懂得了理论,但实际的应用又显得不知从何下手。凭着我个人单薄的力量,我总结了一个比较容易理解和应用的例子,通过这个例子的学习,我相信很快就能学会回调函...

想用windows写MapReduce,但是执行的时候走集群,该怎么做

如果直接在linux下安装eclipse或者idea运行是最方便的。但是linux下编程并不方便,所以想用windows。直接用idea run一段mapreduce的时候,in是取自hdfs://…...

hdu 1199想用线段树,结果发现不好处理,某天突然想起这方法。。易懂,不好写。。。

#include #include #include #include #include using namespace std; struct node//区间结点 { int a,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个超时的题,本是想用Java学调试的,写辛苦了,所以抄下来
举报原因:
原因补充:

(最多只允许输入30个字)