BestCoder Round #54 (div.1)

题目链接:http://acm.hdu.edu.cn/search.php?field=problem&key=BestCoder+Round+%2354&source=1&searchmode=source

                                        hdu5428 The Factor(1001)
Time Limit: 2000/1000 MS (Java/Others)                  Memory Limit: 65536/65536 K (Java/Others)

问题描述
有一个数列,FancyCoder沉迷于研究这个数列的乘积相关问题,但是它们的乘积往往非常大。幸运的是,FancyCoder只需要找到这个巨大乘积的最小的满足如下规则的因子:这个因子包含大于两个因子(包括它本身;比如,4有3个因子,因此它是满足这个要求的一个数)。你需要找到这个数字并输出它。但是我们知道,对于某些数可能没有这样的因子;在这样的情况下,请输出-1.

输入描述
输入文件的第一行有一个正整数T (1≤T≤15),表示数据组数。 接下去>有T组数据,每组数据的第一行有一个正整数n (1≤n≤100). 第二行有n个正整数a1​​ ,…,a​n​​ (1≤a​1​​ ,…,a​n​​ ≤2×10^9​​ ), 表示这个数列

输出描述
输出T行T个数表示每次询问的答案。

输入样例
2
3
1 2 3
5
6 6 6 6 6

输出样例
6
4

题目很简单,但是题意看了半天。
第二个样例:6*6*6*6*6的最小公约且符合条件数为4
对于每一个数字,它有用的部分其实只有它的所有质因子(包括相等的)。求出所有数的所有质因子中最小的两个,相乘就是答案。如果所有数字的质因子个数不到两个,那么就是无解。时间复杂度O(n*sqrt(a))。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;

long long a[200];
long long b[100000];

int main(void)
{
    int T, i;
    long long j;
    scanf("%d", &T);
    while(T--)
    {
        int n;
        scanf("%d", &n);
        for(i = 0; i < n; i++)
            scanf("%lld", &a[i]);
        int k = 0;
        memset(b, 0, sizeof(b));
        for(i = 0; i < n; i++)
        {
            long long tmp = a[i];
            for(j = 2 ;j * j <= a[i];)
            {
                if(tmp % j == 0)
                {
                    b[k++] = j;
                    tmp /= j;
                }
                else
                    j++;
            }
            if(tmp != 1)
                b[k++] = tmp;
        }
        sort(b, b+k);
        if(k > 1)
        printf("%lld\n", b[0]*b[1]);
        else printf("-1\n");
    }
    return 0;
}
                            hdu5429 Geometric Progression(1002)
Time Limit: 2000/1000 MS (Java/Others)                  Memory Limit: 65536/65536 K (Java/Others)

问题描述
判断一个数列是否为等比数列。

在数学中,等比数列,是一个数列,这个数列中的第一项之后的每一项是前一项乘上一个固定的非零实数(我们称之为公比)。比如,数列 2, 6, 18, 54, … 是一个公比为3的等比数列。 类似的,10,5,2.5,1.25,…是一个公比为0.5的等比数列。
等比数列的一般形式是:
a,ar,ar^2,ar^3,ar^4,…
其中r!=0,r为公比,a是首项(a可以是任何实数)

输入描述
第一行一个整数T,表示数据组数。T≤20
对于每一个组,第一行一个整数n(1≤n≤100),接下来第二行n个数允许前导零的非负整数Ai​​​,表示数列。保证Ai​​​ 位数≤100。

输出描述
对于每一个组,输出Yes或者No。

输入样例
4
1
0
3
1 1 1
3
1 4 2
5
16 8 4 2 1

输出样例
Yes
Yes
No
Yes

判断是否为等比数列,可以检验对所有1 < i < n A[i−1]∗A[i+1]=A[i]∗A[i] 是否都成立。

比较简单的方法是选择若干质数(保证乘积大于10^200),在模意义下检验。复杂度O(k*n)。k表示选取的质数个数。

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

public class Main{

    public static void main(String args[]){
        Scanner cin = new Scanner(System.in);
        BigInteger []a = new BigInteger [220];
        int T;
        T = cin.nextInt();
        int n, i;
        BigInteger  tmp1, tmp2, ZERO = BigInteger.ZERO;        
        while(T > 0)
        {
            T--;
            n = cin.nextInt();
            for(i = 1; i <= n; i++)
                a[i] = cin.nextBigInteger();
            if(n == 1)//当只有一个数时
            {
                 System.out.println("Yes"); 
                 continue;
            }
            if(n == 2)//当只有两个数时
            {
                if(a[1].equals(ZERO))//a[1]为0
                {
                    if(a[2].equals(ZERO))//a[2]为0
                    {
                        System.out.println("Yes"); 
                        continue;
                    }
                   else
                   {
                        System.out.println("No"); 
                        continue;
                   }
                }
                else
                {
                    if(a[2].equals(ZERO))
                    {
                         System.out.println("No"); 
                         continue;
                    }
                    else
                    {
                         System.out.println("Yes"); 
                         continue;
                    }

                }
            }
            int flag = 0;
            int flag1 = 0;
            for(i = 1; i <= n; i++)
            {
                if(a[i].equals(ZERO) == false)
                {
                    flag1 = 1;
                    break;
                }
            }
            for(i = 1; flag1 == 1 && i+2 <= n; i++)
            {
                tmp1 = a[i].multiply(a[i+2]);
                tmp2 = a[i+1].multiply(a[i+1]);
                if(tmp1.equals(ZERO)) {flag = 1; break;}
                if( tmp1.equals(tmp2) == false)
                {
                    flag = 1;
                    break;
                }
            }
            if(flag == 1)    System.out.println("No");
            else System.out.println("Yes");
        }           
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值