2020 CCPC Wannafly Winter Camp 1 重现赛 H 最大公约数(思维)

【题目】

【题解】

对于给定的范围[1,n]内的k,要求我们判断是否正确,并输出最小的判断数字。

首先我们根据样例来递推一下思路是否正确:

Input :10 1    Output:210

假如k是正确的,那么gcd(k,k)=k;所以假如不正确,我们只需要考虑i在[1,n]范围内gcd(i,k)==k的数字。

对于1来说,有2,3,4,5,6,7,8,9,10这几个数字gcd为1  即为:2,3,2^2,5,2*3,7,2^3,3^2.

因为要求数字最小,所以我们把不必要的数字除去,直到处理完所有可能数字:

  1. 1*2,2,3,2^2,5,2*3,7,2^3,3^2
  2. 1*2*3,2,3,2^2,5,2*3,7,2^3,3^2
  3. 1*2*3*5,2,3,2^2,5,2*3,7,2^3,3^2
  4. 1*2*3*5*7,2,3,2^2,5,2*3,7,2^3,3^2
  5. 综上所述,答案为1*2*3*5*7=210.

根据这个,可以推一下20 3的答案为3*2*3*5=90.

然后我们考虑极限值,最大的情况是500 1,即需要把500以内所有素数相乘,答案太大存不下,所以需要用到大数乘法。

因此我用java写了。

【代码】

import java.util.*;
import java.math.*;
public class Main{
    public static void main(String args[]){
       Scanner cin = new Scanner(System.in);
       int [] a= new int[510];
       int T=cin.nextInt();
       for(int _=1;_<=T;_++) {
    	   int n=cin.nextInt();
    	   int k=cin.nextInt();
    	   BigInteger ans=BigInteger.valueOf(k);
    	   for(int i=k+k;i<=n;i+=k) {
    		   if(a[i]==_) continue;
    		   ans=ans.multiply(BigInteger.valueOf(i/k));
    		   for(int j=i+i;j<=n;j+=i)
    			   a[j]=_;
    	   }
    	   System.out.println(ans);
       }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值