计蒜客2019年蓝桥杯国赛B组模拟赛题题解

第一题

标题:标签
在这里插入图片描述

代码

import java.io.*;
import java.math.BigInteger;
import java.util.*;

public class Main {
	public static void main(String[] args)
	{
		long sum=1;
		for(int i=2;i<=1325476;i++)
		{
			sum=sum*i;				
			while(sum%10==0) sum=sum/10;
			sum=sum%100000000;
		}
		System.out.println(sum);
	}
}

运行结果:
在这里插入图片描述
注意这里多保留了几位,最终结果为:137664

第二题

标题:101串

在这里插入图片描述

代码

第三题

标题:游戏

在这里插入图片描述

代码

import java.io.*;
import java.math.*;
import java.util.*;
/*
可以观察到C+D=A+B=定值(Constant),C永远小于Constant
第一轮:C=2*A=(2*A)%Constant
第二轮:C=(2*2*A)%Constant 
……
第K轮:C=(2^K*a)%Constant  D=Constant-C
A=min(C,D)
 */
public class Main {
	public static void main(String[] args)
	{
		BigInteger A=new BigInteger("482333897982347239");
		BigInteger B=new BigInteger("557432748293424892");
		BigInteger K=new BigInteger("1389472389742429877");
		BigInteger Constant=A.add(B);
		BigInteger C=BigInteger.valueOf(2).modPow(K, Constant).multiply(A).mod(Constant);
		System.out.println(C.min(Constant.subtract(C)));
	}
}

结果:383513242709218605

第四题

标题:公约数
在这里插入图片描述

代码

import java.io.*;
import java.util.*;
 /*
 数组a和f分别存储输入数据和每个数出现的次数
 maxn记录该组数中的最大值
 从maxn开始找,从f数组中统计是maxn倍数的数出现的次数
 如果出现的次数大于k则最大公约数即为maxn,否则继续向下寻找
  */
public class Main {
	static int maxn=0,k;
	static int result=1;
	static int[] f;
	//判断是num的倍数的数出现的次数
	static boolean judge(int num)
	{
		int sum_count=0;
		for(int i=num;i<=maxn;i+=num)
		{
			sum_count+=f[i];
		}
		//如果出现次数大于k,则num就是最大公约数,返回true
		if(sum_count>=k) return true;
		return false;
	}
	public static void main(String[] args) throws IOException
	{
		BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
		String[] s=reader.readLine().split(" ");
		int n=Integer.parseInt(s[0]);
		k=Integer.parseInt(s[1]);
		String[] ss=reader.readLine().split(" ");
		int[] a=new int[n];//存储输入的数
		f=new int[1000001];//存储每个数出现的次数
		for(int i=0;i<n;i++)
		{
			a[i]=Integer.parseInt(ss[i]);
			f[a[i]]++;
			maxn=Math.max(maxn,a[i]);
		}
		//从大到小判断每个数
		for(int i=maxn;i>1;i--)
		{
			if(judge(i)&&f[i]!=0)
			{
				result=i;
				break;
			}
		}
		System.out.println(result);
		reader.close();
	}
}

第五题
在这里插入图片描述在这里插入图片描述
代码

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

public class Main {
	static int[] pre;
	public static void main(String[] args) throws IOException
	{
		BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
		String[] s=reader.readLine().split(" ");
		int N=Integer.parseInt(s[0]);
		int M=Integer.parseInt(s[1]);
		pre=new int[100001];
		//存放顶点
		for(int i=1;i<=N;i++) pre[i]=i;
		int result=1;
		int mod=1046513837;
		for(int i=0;i<M;i++)
		{
			String[] s1=reader.readLine().split(" ");
			int u=Integer.parseInt(s1[0]);
			int v=Integer.parseInt(s1[1]);
			if(find(u)==find(v)) //引入u-v边会形成环
				result=(result*2)%mod;//引入一条边会使环的数量变为原来的两倍
			else//构不成环则连接
				connect(u,v);	
			System.out.println(result-1);
		}
	}
	private static void connect(int u, int v) {
		int fx=find(u);
		int fy=find(v);
		if(fx!=fy)
			pre[fx]=fy;
		
	}
	private static int find(int x) {
		if(pre[x]==x) return x;
		else
			return find(pre[x]);
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值