牛客想开了大赛2(Java版)

A:链接:https://ac.nowcoder.com/acm/contest/907/A
来源:牛客网

小a的平面上有n个X型不明物体,但是他不确定他们的位置。现在请你来确定他们的位置,使得划分形成的平面尽量多
思路代码里,就是找规律,推公式
AC代码:



import java.util.Scanner;
//公式,可以先通过一条直线,2条直线,3条直线找规律
//一条直线:2块;
//两条直线:4块;
//三条直线:7块;
//四条直线:11块;
//推出n>1时,f[n]=f[n-1]+n;
/*f(n)=f(n-1)+n
=f(n-2)+(n-1)+n
……
=f(1)+1+2+……+n
=n(n+1)/2+1*/
//f=(n/2)*(n+1)+1
public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		long n=sc.nextLong();
		System.out.println(n*(2*n+1)+1);
		sc.close();
	}
}

B:
t次询问,每次给你一个数n,求在[1,n]内约数个数最多的数的约数个数

链接:https://ac.nowcoder.com/acm/contest/907/B
来源:牛客网

对于100%的数据,t <= 500 , 1 <= n <= 1000000000000000000
AC代码:

import java.util.Scanner;
/*首先给出一个简单的求因子个数的公式
设n=p1^k1*p2^k2*……*pn^kn,其中p1,p2,……,pn为互不相同的质数,k1,k2,……,kn为正整数(这叫n的标准分解)
则n所有正约数个数为(k1+1)(k2+2)*……*(kn+1)个
15464=2^3*1933
正约数为(3+1)*(1+1)=8个
然后给出一个溢出的相关的知识:当整型数据超出取值范围时 数据呈环形变化 例如32767 + 1 = -32768 36767 +2 = -32767
因为比较情况比较复杂,于是本题防溢出的方式不是这个。。。
*/
public class Main {
	static int p[]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,51};
	static long ans,n;
	static long pow(int x,int y){
		long res=1;
		for(int i=1;i<=y;i++){
			res*=x;
		}
		return res;
	}
	static void dfs(int pos,long num,long sum,int len){//pos为当前所选素数位置,num为当前约数个数,i为当前素数个数
		if(sum>n)
			return;
		if(sum<=n)
			ans=Math.max(ans, num);
		for(int i=1;i<=len;i++){
			long res=pow(p[pos],i);
			if(sum>n/res)
				break;
			dfs(pos+1,num*(i+1),sum*res,i);
		}
	}
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int t=sc.nextInt();
		while(t-->0){
			n=sc.nextLong();
			ans=0;
			dfs(1,1,1,30);
			System.out.println(ans);
		}
		sc.close();
	}
}

你可能感兴趣的:(牛客)